【计算机知识学习】OpenCV——形态学操作、图像处理(去噪、平滑)

目录

形态学操作

连通性

操作

腐蚀和膨胀

 开闭运算

 礼帽和黑帽

 图像处理

图像噪声

椒盐噪声

高斯噪声

图像平滑简介

均值滤波

 高斯滤波

今天的大坑


形态学操作

连通性

        在图像中,最小的单位是像素,每个像素周围有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.2opencv    提示3.4.2.17不存在,所以装了推荐的那一个最低的   

安装失败 不知道原因  我现在把新版的卸载了 试试   cv2 不能运行,卸载成功    刚才下载的还能用  但是还是安装不上

重新 启动 再安装 还是不行    以后应该会用到高斯模糊 所以要下载

python安装旧版的opencv(3.1.0为例)_冯相文要加油呀的博客-CSDN博客_python安装低版本opencv

网站中Ctrl+F搜索

.whl文件改后缀为.zip,再解压,把里面的两个文件拷入PythonLib文件夹

现在opencv还不能用  先去 终端 安装   安装了 cv  但是cv2没有成功

貌似是因为pycharm版本太高。

先不管吧    重新装上最新版

总算恢复了 就是不知道 最后安装cv2显示个不匹配什么意思 但是确实能用了

pip install opencv-python==3.4.2.17

如果我们要利用SIFTSURF等进行特征提取时,还需要安装:

pip install opencv-contrib-python==3.4.2.17

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值