基于opencv的的部分图片处理方法及原理(python)

1. 图像灰度化处理

gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)

原理

一幅完整的彩色图像是由多个通道组成的,如RGB、YUV或HSI等。
灰度图像通常是在单个电磁波频谱(如可见光)内测量每个像素的亮度得到的。用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度。这种精度刚刚能够避免可见的条带失真,并且非常易于编程。

将彩色图像转化成为灰度图像的过程称为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255255255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。

实现

根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。

2. 图像平滑(去噪)

  • 平均
blur = cv2.blur(img,(5,5))

原理:
eg:k = 1/9[ [1,1,1],[1,1,1],[1,1,1] ]
eg:k = 1/25[ [1,1,1,1,1], [1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1] ]
这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平
均值来代替中心元素。(卷积核大小可以自定)

  • 高斯模糊
#0 是指根据窗口大小(5,5)来计算高斯函数标准差
blur = cv2.GaussianBlur(img,(5,5),0)

原理:
把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。实现的函数是 cv2.GaussianBlur()。
我们需要指定高斯核的宽和高,必须是奇数(具有标准sigma值的3×3,5×5,7×7比其他核具有更优的性能)。
以及高斯函数沿 X,Y 方向的标准差。如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。如果两个标准差都是 0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。

  • 中值模糊
median = cv2.medianBlur(img,5)

原理:
顾名思义就是用与卷积框对应像素的中值来替代中心像素的值。这个滤波器经常用来除椒盐噪声。
前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。他能有效的去除噪声。卷积核的大小也应该是一个奇数。

  • 双边滤波
#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
#d – Diameter of each pixel neighborhood that is used during filtering.
# If it is non-positive, it is computed from sigmaSpace
#9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75)

原理:
高斯滤波在保留信号的条件下减少噪音,这种方法在接近边缘处无效,因此高斯滤波会磨平边缘。
双边滤波提供不会将边缘平滑掉的方法,但代价是需要更多函数。
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。

3. 二值化

全局二值化

确定全局阈值,根据阈值将灰度图二值化(一般是0和255)

ret1,pic=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
                     #图片 ,阈值,超过阈值后像素值变化为,阈值方法:• cv2.THRESH_BINARY
																 • cv2.THRESH_BINARY_INV
																 • cv2.THRESH_TRUNC
																 • cv2.THRESH_TOZERO
																 • cv2.THRESH_TOZERO_INV
ret2,pic = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering

ret:阈值
ret1:自定义127(中值)为阈值
ret2:Otsu’s二值法(大津):cv2.THRESH_OTSU , 将阈值设为0,算法自动寻找最优阈值(以像素值为横坐标,像素数为纵坐标的直方图中双峰之间的最低点。此算法对对于非双峰图像,得到的结果可能会不理想)
pic:二值化之后的图片

局部二值化

th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\cv2.THRESH_BINARY,11,2)

当同一幅图像上的不同部分的具有不同亮度时,此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
后三个参数:
• Adaptive Method- 指定计算阈值的方法。
– cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平
均值
– cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域
的加权和,权重为一个高斯窗口。
• Block Size - 邻域大小(用来计算阈值的区域大小)。
• C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常
数。

4.开运算与闭运算

非二值:

  • 腐蚀:求局部最小值操作,计算核覆盖区域的最小值,并将中心元素替换为最小值
  • 膨胀:求局部最大值操作(与腐蚀对应)

在二值化的前提下

腐蚀和膨胀

  • 腐蚀
kernel = np.ones((5,5),np.uint8) 							#自定义核	
erosion = cv2.erode(img,kernel,iterations = 1)   

把前景物体的边界腐蚀掉(将斑点腐蚀(消除细的凸起),保留较大区域)
原理:
卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。
根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为 0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。

  • 膨胀
dilation = cv2.dilate(img,kernel,iterations = 1)

增加前景
原理:
与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元
素的像素值就是 1。
膨胀也可以用来连接两个分开的物体。

开运算与闭运算

对于连通区域分析算法中,都会用到闭运算来去除噪音引起的区域。对于连通区域分析通常先采用腐蚀或闭运算来消除纯粹由噪音引起的部分,然后用开运算来接近临近的区域。
对于连通区域的计算与相关处理:
连通计数matlab
相关函数介绍

  • 开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

先进性腐蚀再进行膨胀就叫做开运算(消除高于其临近点的孤立点),被用来去除噪声。如,将相邻细胞分离开。
开运算通常可以用来统计二值图像中的区域数。

  • 闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

先膨胀再腐蚀(消除了低于其临近点的孤立点)。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。

*待更新…

发布了6 篇原创文章 · 获赞 1 · 访问量 361

猜你喜欢

转载自blog.csdn.net/qq_43461153/article/details/90339588
今日推荐