目录
形态学操作
连通性
操作
腐蚀和膨胀
开闭运算
礼帽和黑帽
图像处理
图像噪声
椒盐噪声
高斯噪声
图像平滑简介
均值滤波
高斯滤波
今天的大坑
形态学操作
连通性
在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有3种:4邻接、8邻接和D邻接。
操作
腐蚀和膨胀
腐蚀和膨胀是针对白色部分(高亮部分)而言的。
膨胀就是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域
腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。
膨胀是求局部最大值的操作,腐蚀是求局部最小值的操作。
膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的孔洞。
使用一个5*5的卷积(在我的学习过程中第一次见到卷积这个词)实现腐蚀和膨胀的运算:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 膨胀 腐蚀
# 读取图像
img = cv.imread("D:\Python\Opencvlearn\\02.code\image\\arrows.jpg")
# 创造核结构
kernel = np.ones((5,5),np.uint8)
# 膨胀
dilate = cv.dilate(img,kernel)
# 腐蚀
erosion = cv.erode(img,kernel)
# 图像展示
# 建立一个窗口 同时显示所有
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=50)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dilate[:,:,::-1])
axes[1].set_title("膨胀后结果")
axes[2].imshow(erosion[:,:,::-1])
axes[2].set_title("腐蚀后结果")
plt.show()
# plt 需要通道反向 -1
# plt.imshow(img)
# plt.imshow(img[:,:,::-1])
# plt.imshow(dilate)
# plt.imshow(erosion)
# plt.show()
# cv 只能显示最后一张
# cv.imshow("",img)
# cv.imshow("",dilate)
# cv.imshow("",erosion)
# cv.waitKey(0)
开闭运算
开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。 但这两者并不是可逆的,即先开后闭并不能得到原来的图像。
开运算(修理外部)
开运算是先腐蚀后膨胀,作用:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像。
闭运算(修理内部)
闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域。
使用10*10的核结构(什么意思:卷积核大小:卷积核决定卷积的视野。2D 卷积的常见卷积核为 3,即 3x3 像素。与深度学习关系密切)对卷积进行开闭运算的实现。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("D:\Python\Opencvlearn\\02.code\image\letter.png")
img2 = cv.imread("D:\Python\Opencvlearn\\02.code\image\letterclose.png")
# 创建核结构
kernel = np.ones((10,10),np.uint8)
# 开运算 闭运算
cvOpen = cv.morphologyEx(img,cv.MORPH_OPEN,kernel)
cvClose = cv.morphologyEx(img,cv.MORPH_CLOSE,kernel)
# 显示
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img)
axes[0,0].set_title('原图')
axes[0,1].imshow(cvOpen)
axes[0,1].set_title('开运算结果')
axes[1,0].imshow(img2)
axes[1,0].set_title('原图')
axes[1,1].imshow(cvClose)
axes[1,1].set_title('闭运算结果')
plt.show()
礼帽和黑帽
礼帽运算
原图像与“开运算“的结果图之差,如下式计算:
因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
礼帽运算用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
黑帽运算
为”闭运算“的结果图与原图像之差。数学表达式为:
黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。
黑帽运算用来分离比邻近点暗一些的斑块。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("D:\Python\Opencvlearn\\02.code\image\letter.png")
img2 = cv.imread("D:\Python\Opencvlearn\\02.code\image\letterclose.png")
# 创建核结构
kernel = np.ones((10,10),np.uint8)
# 礼帽运算 黑帽运算
cvOpen = cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
cvClose = cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)
# 显示
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img)
axes[0,0].set_title('原图')
axes[0,1].imshow(cvOpen)
axes[0,1].set_title('黑帽运算结果')
axes[1,0].imshow(img2)
axes[1,0].set_title('原图')
axes[1,1].imshow(cvClose)
axes[1,1].set_title('礼帽运算结果')
plt.show()
图像处理
图像噪声
椒盐噪声
也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。
高斯噪声
高斯噪声是指噪声密度函数服从高斯分布的一类噪声。由于高斯噪声在空间和频域中数学上的易处理性,这种噪声(也称为正态噪声)模型经常被用于实践中。
图像平滑简介
图像平滑从 信号处理的角度 看就是去除其中的高频信息,保留低频信息。
因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。
均值滤波
均值滤波的优点是算法简单,计算速度较快,缺点是在去噪的同时去除了很多细节部分,将图像变得模糊。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 均值滤波
# 读取图像
img = cv.imread("D:\Python\Opencvlearn\\02.code\image\\dogsp.jpeg")
# 均值滤波
blur = cv.blur(img,(5,5))
# 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(blur[:,:,::-1])
axes[1].set_title("均值滤波后结果")
plt.show()
# 课件中
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('均值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()
高斯滤波
二维高斯是构建高斯滤波器的基础
import cv2 as cv # 版本问题 演示不了 只是路径问题 呜呜呜~ 浪费上边那么多心思
import numpy as np
import matplotlib.pyplot as plt
# 高斯滤波
# 读取图像
img = cv.imread("D:\Python\Opencvlearn\\02.code\image\dogGauss.jpeg")
# 高斯滤波
blur = cv.GaussianBlur(img,(3,3),1)
# 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(blur[:,:,::-1])
axes[1].set_title("高斯滤波后结果")
plt.show()
中值滤波
中值滤波是 非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值。
中值滤波对椒盐噪声(salt-and-pepper noise)来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值。
img = cv.imread('./image/dogsp.jpeg')
# 2 中值滤波
blur = cv.medianBlur(img,5)
# 3 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(blur[:,:,::-1])
axes[1].set_title("中值滤波后结果")
plt.show()
今天的大坑
这里提示opencv中 cv2没有 高斯模糊(我翻译错了) 猜测是因为前边装的版本问题 所以又装了 低于3.4.2的opencv 提示3.4.2.17不存在,所以装了推荐的那一个最低的
安装失败 不知道原因 我现在把新版的卸载了 试试 cv2 不能运行,卸载成功 刚才下载的还能用 但是还是安装不上
重新 启动 再安装 还是不行 以后应该会用到高斯模糊 所以要下载
python安装旧版的opencv(3.1.0为例)_冯相文要加油呀的博客_python安装低版本opencv
网站中Ctrl+F搜索
把.whl文件改后缀为.zip,再解压,把里面的两个文件拷入Python的Lib文件夹
现在opencv还不能用 先去 终端 安装 安装了 cv 但是cv2没有成功
貌似是因为pycharm版本太高。
先不管吧 唉 重新装上最新版
总算恢复了 就是不知道 最后安装cv2显示个不匹配什么意思 但是确实能用了
pip install opencv-python==3.4.2.17
如果我们要利用SIFT和SURF等进行特征提取时,还需要安装:
pip install opencv-contrib-python==3.4.2.17