《深度学习》 OpenCV 计算机视觉入门 (下篇)

目录

一、OpenCV函数使用

 1、平滑处理

1)均值滤波(cv2.blur())

运行结果:   (图片来源网络,如若侵权敬请联系删除)

2)高斯滤波(cv2.GaussianBlur())

运行结果:

3)中值滤波(cv2.medianBlur())

运行结果:

4)方框滤波(cv2.boxFilter())

运行结果:

2、图像形态学

1)膨胀(Dilation)

运行结果:

2)腐蚀(Erosion)

运行结果:

3)开运算(Opening)

运行结果:

​编辑​编辑

4)闭运算(Closing)

运行结果:

5)梯度运算(Morphological Gradient)

6)顶帽运算(Top Hat)

运行结果:

7)黑帽运算(Black Hat)

运行结果:

二、总结

1、OpenCV中的图像平滑处理主要包括以下几种方法:

2、图像形态学是一种基于形态学运算的图像处理方法,主要包括以下几种操作:


一、OpenCV函数使用

 1、平滑处理

1)均值滤波(cv2.blur())

         是指用当前像素点周围nxn个像素值的均值来代替当前像素值。边界点的处理可以扩展当前图像的周围像素点padding

代码演示:

import numpy as np
import cv2
# 平滑处理
def add_peppersalt_noise(img,n=10000):
    result = img.copy()  # 复制图片
    h,w = img.shape[:2]   # 获取图像的高度和宽度
    for i in range(n):
        x = np.random.randint(1,h)   # 随机生成高度范围内整数
        y = np.random.randint(1,w)   # 随机生成宽度范围内整数
        if np.random.randint(0,2) == 0:  # 判断生成的随机数是否等于0
            result[x,y] = 0  # 将图片result中坐标(x,y)像素值更改为0(白色)
        else:
            result[x,y] = 255  # 将图片result中坐标(x,y)像素值更改为255(黑色)
    return result


if __name__ == '__main__':
    img = cv2.imread('girl.jpg')
    cv2.imshow('noise',img)
    cv2.waitKey(0)
    noise = add_peppersalt_noise(img)  # 增加椒盐噪声点用,处理完赋值给noise
    cv2.imshow('noise',noise)
    cv2.waitKey(0)

# 均值滤波
# 对图片noise,使用3x3 对每个像素周围的像素均值作为输出像素的值
    blur_1 = cv2.blur(noise,(3,3))
    cv2.imshow('blur_1',blur_1)
    # cv2.waitKey(0)

    blur_2 = cv2.blur(noise,(5,5))  # 使用5x5 计算均值
    cv2.imshow('blur_2',blur_2)
    cv2.waitKey(0)
运行结果:   (图片来源网络,如若侵权敬请联系删除)

2)高斯滤波(cv2.GaussianBlur())

         对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

σ:标准差,为1是标准正态分布

直接在上述代码后增加下列代码部分即可:

GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow("GaussianBlur",GaussianB)
cv2.waitKey(0)
运行结果:

3)中值滤波(cv2.medianBlur())

         会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。

medianB = cv2.medianBlur(noise,5)
cv2.imshow("medianB",medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:

4)方框滤波(cv2.boxFilter())

        用当前的像素点周围3x3个像素值的和来代替当前像素值

boxFilter_1 = cv2.boxFilter(noise,-1,(3,3),normalize=True)
cv2.imshow("boxFilter",boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize=False)
cv2.imshow('boxFilter',boxFilter_2)
cv2.waitKey(0)
运行结果:

  

2、图像形态学

                

1)膨胀(Dilation)

        通过增加图像中边缘的像素值来增加图像的亮度和粗细。

wenzi = cv2.imread('wenzi.png')
cv2.imshow('src',wenzi)
cv2.waitKey(0)

kernel = np.ones((2,2),np.uint8)
erosion_new = cv2.erode(wenzi,kernel,iterations=2)
cv2.imshow('wenzi_new',wenzi)
cv2.waitKey(0)
运行结果:

2)腐蚀(Erosion)

        通过减小图像中边缘的像素值来减小图像的亮度和粗细。

import numpy as np
import cv2

# 图像腐蚀

sun = cv2.imread('sun.png')
cv2.imshow('src',sun)
cv2.waitKey(0)

kernel = np.ones((5,5),np.uint8)
erosion_1 = cv2.erode(sun,kernel,iterations=2)
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)
运行结果:

3)开运算(Opening)

        先腐蚀再膨胀的操作,用于去除小的噪点和细线。

zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('src',zhiwen)
cv2.waitKey(0)

kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)
运行结果:
4)闭运算(Closing)

        先膨胀再腐蚀的操作,用于填充小的空洞和连接断开的线条。

zhiwen = cv2.imread('zhiwen_duan.png')
cv2.imshow('src',zhiwen)
cv2.waitKey(0)

kernel = np.ones((4,4),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)
运行结果:

  

5)梯度运算(Morphological Gradient)

        通过计算膨胀图像和腐蚀图像的差,突出图像的边缘。

wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi_new',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)

# 膨胀
pz_wenzi = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('pz_wenzi',pz_wenzi)
cv2.waitKey(0)

# 腐蚀
fs_wenzi = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('fs_wenzi',fs_wenzi)
cv2.waitKey(0)

# 膨胀-腐蚀
bianyuan = cv2.morphologyEx(wenzi,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('bianyuan',bianyuan)
cv2.waitKey(0)

6)顶帽运算(Top Hat)

        原始图像与开运算之差,用于提取亮的小区域,例如小的光斑。

# 顶帽、黑帽
sun = cv2.imread('sun.png')
cv2.imshow('sun_yuantu',sun)
cv2.waitKey(0)

kernel = np.ones((2,2),np.uint8)

# 开运算
open_sun = cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow('open_sun',open_sun)
cv2.waitKey(0)

# 闭运算
close_sun = cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow('close_sun',close_sun)
cv2.waitKey(0)
运行结果:

7)黑帽运算(Black Hat)

        闭运算与原始图像之差,用于提取暗的小区域,例如小的黑点。

        将上述顶帽运算的后半部分代码更改为下列即可

# 黑帽
blackhat = cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow("BLACKHAT",blackhat)
cv2.waitKey(0)
运行结果:

二、总结

1、OpenCV中的图像平滑处理主要包括以下几种方法:

  1. 均值滤波:通过计算像素周围邻域的平均值来平滑图像,可以有效地去除噪声,但会导致图像模糊。

  2. 高斯滤波:采用加权平均值的方式来平滑图像,权重由高斯函数计算得到,适用于去除高斯噪声。

  3. 中值滤波:通过取邻域内像素的中值来进行滤波,适用于去除椒盐噪声。

  4. 双边滤波:结合了空间距离和像素值相似性的权重,能够保持图像的边缘信息。

2、图像形态学是一种基于形态学运算的图像处理方法,主要包括以下几种操作:

  1. 腐蚀:用一个结构元素对图像进行局部最小值操作,可以用于去除小的噪点,并可以得到图像的骨架。

  2. 膨胀:用一个结构元素对图像进行局部最大值操作,可以填充断开的边缘,并可以扩展图像。

  3. 开运算:先腐蚀后膨胀的过程,可以去除小的连通区域。

  4. 闭运算:先膨胀后腐蚀的过程,可以填充小的空洞。

  5. 梯度运算:利用膨胀和腐蚀的差异来提取边缘信息。

图像形态学操作常用于图像分割、图像修复和纹理分析等领域。

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜就多练_0828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值