python opencv 直方图均衡化,cv2直方图均衡化

  python opencv 直方图均衡化,cv2直方图均衡化

  另一方面,轮廓滤波是信号和图像处理中的基本操作之一,其目的是有选择地提取图像某一面的内容。例如,过滤包括过滤图像中的噪声、提取有用的视觉特征、对图像进行采样等。以下是一些关于过滤的重要概念。

  图像是由不同灰度(或颜色)组成的图案,因为图案的灰度在某些地方变化很大(比如有很多小物体的场景等。),并且灰度的强度在某些地方几乎不变(例如,大海、蓝天、草地等。),而这个特征可以用频域来表示。观察灰度分布来描述图像的特征称为空域。

  在频域分析中,图像被分解成范围从低频到高频的高频分量。图像强度变化慢的区域只包含低频,强度变化快的区域产生高频。因为图像是二维的,所以频率可以分为垂直频率(垂直变化)和水平频率(水平变化)。

  二、低通滤波器低通滤波器的作用是去除图像的高频部分,使图像更加平滑。

  1.将平均滤波图像中每个像素的值替换为其周围像素的平均值,使图像更加平滑。opencv对应的平均过滤函数如下。

  Voidblur(inputarraysrc,//输入图像输出数组dst,//输出图像大小ksize,//滤波器核心大小pointanchor=point )-1,-1,//默认值为BORDER_DEFAULT,实验图像分别选择大小(5*5)和大小(10 * 10)两种滤波器比较效果。

  Cv :3360蓝宝石(image,result_55,cv:3360size) 5,5);//滤镜大小5*5cv:3360blur(image,result_1010,cv33603360size) 10,10));//过滤器尺寸10*10

  原图

  过滤核分别为5*5和10*10。过滤核越大越模糊,近视越痛苦。

  相关原理:

  滤波器核实际上是一个矩阵,矩阵中的值是权重,5*5和10*10是对应的矩阵大小。对于一个3*3的普通滤镜,它对应的滤芯可能就这么长。

  以上面的过滤器内核为例。当这个滤镜移动到图像中的每个像素时,它旁边的每个像素都会乘以1,然后进行加法平均。最后,原始像素的值将被这个平均值替换。

  2.对于xsdmg滤波,像素越近,其重要性需要越高,计算加权平均值,即像素越近,其权重越大,基于xsdmg函数制定加权策略。opencv对应的xsdmg过滤函数如下:

  VoidGaussianblur(inputarraysrc,//输入图像输出数组dst,//输出图像大小ksize,//滤波器大小double sigmaX,xsdmg控制曲线形状的参数double。

  cv:mati image=cv:3360 im read(小狗。BMP);cv:3360imshow(小狗,图片);Cv:高斯蓝(图像,结果,CV: 3360大小)5,5),1.5);cv :3360 im显示(高斯滤波)、结果);

  相关原理:

  对于xsdmg滤镜,对应于像素的权重与到中心像素的距离成比例。一维xsdmg的公式如下。

  这里,a是归一化系数。为了使xsdmg曲线下的面积为1,根据符号sigma的值确定xsdmg曲线的宽度。该值越大,xsdmg曲线越平坦。接下来是si。

  gma=0.5和sigma=1.5时的Xsdmg曲线:

  xsdmg函数是一条对称的钟形曲线。离中心点越远,像素的权重越低,这使得像素之间的过渡更平滑。当曲线较平坦时(接近均值滤波器),远处的像素会使当前的平均值突然发生变化。从频率的角度来看,均值滤波器并不能消除所有的高频成分。

  因为xsdmg滤镜是一个可分离的滤镜,所以在对一个图像应用二维xsdmg滤镜时,只需要在横线上应用一维xsdmg滤镜(在水平方向过滤频率),然后在竖线上再应用一维xsdmg滤镜(在垂直方向过滤频率)。

  注意,在openCV中使用cv:GaussianBlur()函数对图像进行xsdmg过滤时,除了前两个输入输出图像外,还应提供过滤器大小(第三个参数必须是奇数)和(第四个参数)的值。要么只有提供的值由openCV决定滤镜大小(输入滤镜大小的值为0),要么只有滤镜大小输入,openCV决定自己判断合适的值。

  cv:GaussianBlur(图像,结果,cv:Size(9,9),1.5);//第三个参数应该是奇数CV:高斯模糊(image,result,CV: size (10,10),1.5);//将会报告一个错误。3.通过使用滤镜减少像素采样来降低图像精度的过程称为像素采样。在缩小一幅图像时,简单地删除图像中的一些行和列,会导致图像锯齿较多,视觉效果不佳。因此,在删除一些行和列之前,应该对原始图像进行低通滤波,这样在获得的图像中就不会出现伪影。

  直接去除一部分行和列

  cv:Mat image=cv:im read( boldt . jpg ,0);//读取照片CV:matre duced(image.rows/4,image.cols/4,CV _ 8u);for(int I=0;我减少了行数;I){ for(int j=0;j reduced.colsj ){reduced.atuchar(i,j)=image.atuchar(i * 4,j * 4);}}cv:resize(reduced,reduced,cv:Size(),4,4,cv:INTER _ NEAREST);//将每个像素的cv:imshow(Reduced ,Reduced)显示为其原始大小的四倍;

  直接去掉一些行列结果。

  经过低通滤波后再缩减像素

  cv:GaussianBlur(image,image,cv:Size(11,11),1.75);//第三个参数应该是奇数CV:matre duced 2(image.rows/4,image.cols/4,CV _ 8u);//每四个像素保留一个(int I=0;我减少了2 . rows;I){ for(int j=0;j reduced2.colsj ){reduced2.atuchar(i,j)=image.atuchar(i * 4,j * 4);} } cv:Mat new image;cv:resize(reduced2,newimage,cv:Size(),4,4,cv:INTER _ NEAREST);//将每个像素的cv:imshow(Reduced2 ,newimage)显示为其原始大小的四倍;

  可以看出,xsdmg过滤后减少像素的视觉效果要比直接删除像素好很多。

  四。像素插值缩放后的图像必须按像素进行插值。常见的图像插值方法有:最近邻插值、双线性插值和双三次插值。

  最邻近插值法

  将要生成的图像的像素网格放置在图像上方,每个新像素都被赋予原始图像中最近像素的值。比如把上面的图放大四倍。

  cv:resize(reduced,newImage,cv:Size(),3,3,cv:INTER _ NEAREST);双线性内插法

  先在新增像素的左右两侧垂直插入两个像素值,然后利用这两个插入的像素(灰色圆圈)在相应的位置插入像素值。

  cv:resize(reduced2,newimage,cv:Size(),4,4,cv:INTER _ LINEAR);

  这篇文章是我学习opencv的笔记,可能有很多不足之处。请批评指正!如果有任何问题,请随时与我沟通。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: