
图像处理
MikeDai
专注结构光3D重建、机器视觉、图像处理算法、计算机视觉、C++编程
展开
-
C实现hough变换拟合直线
原理: 对于平面上的一个点(x1,y1),满足方程:y1=mx1+b,经过点(x1,y1)的直线有无数条,只要其满足刚才的直线方程。然而,可以把直线方程变形一下,b=-x1 m+y1,在考虑由点(m,b)组成的面,这里叫为参数空间,由(-x1, y1)确定一条直线。同样,由另外一个点(x2,y2)可以确定参数空间的一条直线,b2= -x2m+y2。如果这条直线不平行于b=-x1 m+y1,那么一定原创 2017-03-21 14:05:45 · 5800 阅读 · 6 评论 -
zbar源码分析--技术关键点及优化策略
前面一篇文章已经说过zbar中QR的解码流程,现在这里主要介绍一些技术关键点和专注优化策略上的建议:仿射变换:已知三个点:(x1,y1)、(x2,y2)、(x3,y3),原点为(x1,y1),映射到(0,0)、(1,0)、(0,1)。没有采用高斯消元法求解线性方程,二是直接采用最终推导公式计算相关参数。1、计算三个点组成的行列式。2、使用克拉姆法则计算h1、h2、h4、h5,h3、h6是平移参原创 2017-03-24 10:17:41 · 3456 阅读 · 27 评论 -
zbar源码分析--QR解码过程分析
QR解码流程:运动均值去噪、二阶微分边缘检测、获取QR定位标志、生成finder pattern 聚类、计算相交的水平聚类和垂直聚类的中心、识别符号。定位搜索 运动均值阈值:先做水平扫描,再做垂直扫描。图像扫描是以Z字型模式逐行扫描,采用运动均值去噪,其中窗口大小为N=4。为了节省效率,在优化时,去掉边界检查。每扫描一行或一列需要做空白边处理。二阶微分边缘检测:1、对运动均值后图像做二阶原创 2017-03-24 09:58:47 · 6681 阅读 · 33 评论 -
图像多边形填充算法
算法原理: 参考连接:http://alienryderflex.com/polygon/,这里介绍得很详细,但是参考其中代码,实现下来,发现其中有一个bug,不知道是不是我自己的问题。 多边形绘制在原始图上: 为了高效,先确定多边形的坐标范围:typedef struct boundary_t{ int left; int right; int top...原创 2018-03-26 20:05:45 · 2679 阅读 · 0 评论 -
opencv实现傅里叶变换
参考opencv文档,https://docs.opencv.org/2.4/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html 读取图像文件: const char* filename = argc >=2 ? argv[1] : "lena.jpg"; Mat ...原创 2018-03-26 21:01:47 · 1209 阅读 · 0 评论 -
VS2013编译ffmpeg
我这里采用的是别人已经移植好的成品,也可以采用MinGW,像linux风格的编译,这里不再提。 下载地址: https://github.com/ShiftMediaProject/FFmpeg/ 在D盘或E盘新建目录FFmpeg-window。下载之后解压到此目录,其他第三方库也解压到此目录。 https://github.com/ShiftMediaProject/下包括了ffmpeg所需...原创 2018-03-28 20:42:51 · 1187 阅读 · 0 评论 -
VS2013中使用ffmpeg解码视频
在前一篇文章中讲了如何编译ffmpeg,现在介绍如何使用已经编译好的ffmpeg。 首先使用VS2013新建一个控制台工程,取消预编译头,然后将ffmpeg编译生成的include目录拷贝到此工程下,把include改为ffmpeg。加入到工程的包含路径之下,如下图: 拷贝lib到解决方案目录下,加入包含路径: 包含头文件:extern "C"{#include "libavut...原创 2018-03-28 21:11:03 · 1538 阅读 · 0 评论 -
一维信号峰值检测Matlab实现
参考论文:https://pdfs.semanticscholar.org/56f1/49e51aa9fb9b0b46412b864839f34701d421.pdf 先使用3点运动均值滤波器处理一维信号,先前向再后向处理。作为例子,这里先生成正弦信号波形图,然后执行3点前向运动均值滤波,再3点均值后向运动滤波。信号S(n)={s1,s2,s3,s4,…,sn}.x = 0:0.05:50*...原创 2018-07-16 22:34:08 · 12704 阅读 · 9 评论 -
C实现Canny边缘检测
网上有很多关于Canny实现的文章,但是多数在最后的边缘追踪时采用递归实现或者采用非递归实现个人认为效果又不好或者修改领域跟踪范围复杂。采用递归实现可以参考:http://www.math.tau.ac.il/~turkel/notes/canny_source.cmatlab实现可以参考http://justin-liang.com/tutorials/canny/中给的源码,我就是根据此链...原创 2018-10-10 00:18:53 · 3449 阅读 · 0 评论 -
图像双立方插值——C实现
原理:详细参见https://en.wikipedia.org/wiki/Bicubic_interpolation在数学上,双立方插值是2个变量函数在方形网格上立方插值的一个扩展,在图像处理中,双立方插值考虑插值像素点周围16个像素,当不在乎算法执行速度时,一般选择双立方插值,相对最近邻域插值和二次线性插值,双立方插值具有较少的插值畸变(artifacts ,不知道翻译成什么好)。双立方插值...原创 2019-03-29 23:00:10 · 2936 阅读 · 0 评论 -
图像Lanczos3滤波——C实现
Lanczos 滤波器,因发明者而得名,在信号处理领域,主要用在增加采样率和低通滤波,在图像处理领域用于图像缩放、旋转,其可以在减小锯齿、锐度、振铃效应( aliasing, sharpness, and minimal ringing)取得最好的平衡。滤波函数如下:L(x)={sinc(x) sinc(x/a)if −a<x&l...原创 2019-03-30 09:41:06 · 6122 阅读 · 4 评论 -
图像Lanczos3滤波C实现——优化
上一篇博文给出了图像Lanczos3滤波的直观实现,但是整个算法实现过于低效,其原因在于对于每个插值点,都需要重新计算Lanczos系数,本文参考https://github.com/richgel999/imageresampler中的实现,将其C++代码转换成C实现。优化思路:每一行其插值的x位置相同,每一列其插值的y位置相同,因此可以将x位置的插值系数做成table,将y位置的插值系数也做...原创 2019-03-30 14:57:40 · 2563 阅读 · 10 评论 -
图像形态学shrink——C实现
本文实现参考matlab实现方式,将m语言转换成C实现。参考:https://ww2.mathworks.cn/help/images/ref/bwmorph.htmlmatlab中这样调用BW = bwmorph(BW1,‘skel’,n);matlab中这样描述shrink操作:With n = Inf, shrinks objects to points. It removes pixe...原创 2019-04-10 23:24:05 · 1739 阅读 · 0 评论 -
CMYK转RGB
扫描仪的颜色空间一般为CMYK,从扫描仪上得到的图片如果是自己移植图片解码器, 一般需要将CMYK转换至RGB888。相关解释,参考国外资料: To understand the CMYK color model, it is best to start with an understanding of RGB color.The RGB color model is made up of原创 2018-01-15 12:42:14 · 6234 阅读 · 0 评论 -
RGB转YUV
C实现:void rgb24_to_nv12(uint8_t* data, int w, int h, uint8_t* yuv){ uint32_t row_bytes; uint8_t* uv; uint8_t* y; uint8_t r, g, b; uint8_t y_val, u_val, v_val; uint32_t off;原创 2018-01-15 12:28:37 · 1050 阅读 · 0 评论 -
C实现RGB32 Gama校正
C实现Gama变换 原理: Gama变换也幂变换,公式如下: s=cr^γ 输入r与s的变换关系如下图: 上图中,横坐标0附近对应于输入图像中的黑色像素值,纵坐标中0附近对应于输出图像中黑色像素值。由上图可以看出,当γ<1时,Gama变换将输入图像中0值邻域拉伸了,相反,当γ>1时Gama变换将输入图像中0值邻域缩小了。当γ=1时,为恒同变换。上图中,γ=1两边的变换互为逆映射,如原创 2017-03-22 00:23:43 · 1085 阅读 · 0 评论 -
C实现直方图均衡
灰度图像直方图: 8位灰度图计算机中的颜色表示范围0-255,共计256个值。如果把一张具体灰度图看成是一个样本空间,那么0-255可以看成256个事件,这256个事件的概率分布就是灰度图像的直方图。因此可以使用概率的一些理论来分析、修改灰度图。 图一是灰度图,图二是直方图,原创 2017-03-29 14:24:11 · 1262 阅读 · 0 评论 -
C实现直方图匹配
原理: C实现图像直方图匹配 实现原理: 直方图匹配就是将目标图像的直方图变成指定的直方图。 由于直方图均衡可以把直方图变成概率上的均匀分布,所以,可以将原始直方图均衡,再将指定的直方图也均衡处理,理论上,两个直方图是相同的,然后再对均衡后的直方图按照指定的直方图均衡反映射,那么得到的图像就具有指定的直方图。公式推导如下: 首先,对图像进行直方图均衡 对于图像,由于灰度级是离散的,不原创 2017-03-29 17:37:02 · 2904 阅读 · 0 评论 -
C实现改变彩色图像亮度
对于灰度图像,改变亮度只需同时增加或减少整张图像的灰度值即可,但是对于彩色图像,相对来说就比较麻烦点。对RGB空间的图像来说,需将RGB空间转换到HSL,H是色调,S是饱和度,L是亮度。改变亮度时将RGB颜色转换成HSL表示,修改L,其他不变,再将HSL转换为RGB。 公式: RGB to HSL: HSL to RGB: 代码实现:#ifndef max#define max(a原创 2017-03-23 17:14:20 · 2682 阅读 · 2 评论 -
C实现moore边界跟踪算法
原理: 参照冈萨雷斯数字图像处理英文版第11章第一小节。C实现代码如下:static uint8_t* enlarge_gray_img(uint8_t* img, int w, int h, int scale, int pad_value){ uint32_t dst_row_bytes; uint32_t src_row_bytes; uint32_t src_of原创 2017-09-21 21:57:06 · 2309 阅读 · 0 评论 -
C实现椒盐噪声生成
实现代码如下:void salt_peper_noise(uint8_t* gray, int width, int height){ uint8_t* img; int i, j; int low; int h; int tmp; uint32_t n; img = gray; n = width * height; low原创 2017-09-21 23:25:35 · 2178 阅读 · 0 评论 -
ffmpeg av_read_frame源码分析
传入参数:格式上下文,包指针int av_read_frame(AVFormatContext *s, AVPacket *pkt){ const int genpts = s->flags & AVFMT_FLAG_GENPTS; int eof = 0; int ret; AVStream *st;if (!genpts) { 如果没有设定生成pt原创 2018-01-15 13:16:43 · 868 阅读 · 0 评论 -
YUV转RGB--使用MMX和CUDA优化
在http://blog.youkuaiyun.com/mikedai/article/details/64215860这篇博文中,采用查表的方式优化YUV转RGB,但是仍然没有发挥计算机硬件性能,对1920x1080的YV12格式,在intel i7-7700上测试120fps,也即是每帧耗时8ms。 采用mmx结合查找表优化,首先创建查找表,跟之前博文里有点不一样:static short Coeffi原创 2018-01-16 13:00:29 · 5045 阅读 · 6 评论 -
CUDA实现图像二次线性插值缩放
原理: 参考:http://blog.youkuaiyun.com/housisong/article/details/1452249,说得很清楚,这里只是顺带一提。 (Sx-0)/(SW-0)=(Dx-0)/(DW-0) (Sy-0)/(SH-0)=(Dy-0)/(DH-0) => Sx=Dx*SW/DW Sy=Dy*SH/DH 聚焦看看(原创 2018-01-17 12:36:16 · 4777 阅读 · 0 评论 -
CUDA实现JPEG编码
JPEG编码流程图: 详细可以参考:www.eecg.toronto.edu/~moshovos/CUDA08/arx/JPEG_report.pdf 代码参考nvidia提供的例子,不过那个例子是先读取一张jpg图片,然后缩放(处理的是YV12格式的数据),最后编码。很多东西都混在一起,不便宜使用。现在就提取其中有用的,去掉缩放的功能。jpeg数据结构定义://量化表数据st原创 2018-01-17 13:11:41 · 10924 阅读 · 42 评论 -
图像二次线性插值--C实现
1、图像缩放二次线性插值原理:详细参见https://en.wikipedia.org/wiki/Bilinear_interpolation在数学上,二次线性插值是2个变量函数在方形网格上线性插值的一个扩展,其主要做法是先在一个方向上进行线性插值,然后再在另一个方向上进行线性插值,在整体二次线性插值对两变量函数插值而言不是线性的。如图:P点为要插值的点,邻近4个点Q11 = (x1, ...原创 2019-03-28 23:14:43 · 4038 阅读 · 2 评论