计算机视觉——图像预处理及边缘检测

1.为什么要进行图像预处理?

\qquad 当对图像进行边缘、轮廓的检测时,图像噪声会对检测产生不利影响,并且为了帮助模型专注于一般细节并获得更高的准确度,我们需要对图像进行预处理。
\qquad 预处理的内容有去除噪声,控制像素值得强度,一般的处理技巧有模糊(Blurring)、阈值(thresholding)、形态转换(morphological transformation)等。

2.模糊

\qquad 模糊的主要目的是为了降噪,比如当边缘检测算法应用于高分辨率的图像时,会获得很多我们并不感兴趣的内容,这时候我们需要模糊进行降噪。当对图像进行模糊处理时,需要寻找合适的模糊量,模糊量太少,则有太多噪声;模糊量太多,会丢失我们需要的数据。
\qquad OpenCV中常用四种模糊的技术:平均模糊、高斯模糊、中值模糊和双边滤波模糊。
\qquad 这四种模糊技术的原理相同:使用滤波器(内核),对图像进行卷积运算。但是各个模糊技术之间使用的滤波器不同,比如平均模糊,首先计算内核区域下的平均值;然后把平均值替换内核区域的中心值。当内核区域变大时,图像会更模糊。
\qquad 为了验证kernel区域越大,图像越模糊。我们设定当kernel的大小为5 × \times × 5,11 × \times × 11 , 15 × \times × 15对图像进行卷积运算,然后比较各个图像的模糊程度。

import cv2
import matplotlib.pyplot as plt

#读取图像,并将图像矩阵修改为RGB颜色模式
img = cv2.imread('../animal.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#标题中文显示设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

#绘制四张图,依次为原图,内核大小为5*5,11*11,15*15
#原图
plt.subplot(221)
plt.imshow(img)
plt.title("原图")

#内核大小为5*5
plt.subplot(222)
img_blurred = cv2.blur(img,ksize=(5,5))
plt.imshow(img_blurred)
plt.title("kernel 5*5")

#内核大小为11*11
plt.subplot(223)
img_blurred = cv2.blur(img,ksize=(11,11))
plt.imshow(img_blurred)
plt.title("kernel 11*11")

#内核大小为15*15
plt.subplot(224)
img_blurred = cv2.blur(img,ksize=(15,15))
plt.imshow(img_blurred)
plt.title("kernel 15*15")

plt.show()

\qquad 运行结果:
kernel \qquad 高斯模糊,高斯模糊的kernel值是由高斯函数生成,即内核值服从高斯分布。双边滤波模糊,具有去除噪音,同时保持边缘清晰。把四种模糊技术进行对比。

import cv2
import matplotlib.pyplot as plt

#读取图像,并将图像矩阵修改为RGB颜色模式
img = cv2.imread('F:/animal.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#标题中文显示设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

#平均模糊
plt.subplot(221)
img_0 = cv2.blur(img, ksize = (7, 7))
plt.imshow(img_0)
plt.title("平均滤波")

#高斯模糊
plt.subplot(222)
img_1 = cv2.GaussianBlur(img, ksize = (7, 7), sigmaX = 0)
plt.imshow(img_1)
plt.title("高斯模糊")

#中值模糊
plt.subplot(223)
img_2 = cv2.medianBlur(img, 7)
plt.imshow(img_0)
plt.title("中值模糊")

#双边滤波模糊
plt.subplot(224)
img_3 = cv2.bilateralFilter(img, 7, sigmaSpace = 75, sigmaColor =75)
plt.imshow(img_0)
plt.title("双边滤波模糊")

plt.show()

\qquad 运行结果:
在这里插入图片描述

3.阈值

\qquad 阈值处理,就是将图像转换为二进制图像。有五种不同的阈值处理方式:二进制,二进制的逆,阈值为零,阈值到零的倒数和阈值截断。比较五种不同的阈值处理。

import cv2
import matplotlib.pyplot as plt

#读取图像,并将图像矩阵修改为RGB颜色模式
img = cv2.imread('F:/animal.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#标题中文显示设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.subplot(231)
plt.imshow(img)
plt.title("原图")

plt.subplot(232)
_, thresh_0 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
plt.imshow(thresh_0)
plt.title("二进制")

plt.subplot(233)
_, thresh_1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
plt.imshow(thresh_1)
plt.title("二进制的逆")

plt.subplot(234)
_, thresh_2 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
plt.imshow(thresh_2)
plt.title("阈值为零")

plt.subplot(235)
_, thresh_3 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
plt.imshow(thresh_3)
plt.title("阈值到零的倒数")

plt.subplot(236)
_, thresh_4 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
plt.imshow(thresh_4)
plt.title("阈值截断")

plt.show()

\qquad 运行结果:
阈值处理

4.形态转换

\qquad 形态转换,通过过滤来处理对象。过滤器的形状可以为矩形(rectangle),椭圆形(ellipse),十字形(cross)。形态转换的技术有:侵蚀,膨胀等。下面以侵蚀形态转换为例,比较三种形状过滤器的效果。

import cv2
import matplotlib.pyplot as plt
import numpy as np

#读取图像,并将图像矩阵修改为RGB颜色模式
img = cv2.imread('F:/animal.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#标题中文显示设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

#原图
plt.subplot(221)
plt.imshow(img)
plt.title("原图")

#矩形
plt.subplot(222)
kernel_0 = np.ones((9, 9))
img1 = cv2.erode(img, kernel_0, iterations = 3)
plt.imshow(img1)
plt.title("矩形")

#椭圆
plt.subplot(223)
kernel_1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))
img2 = cv2.erode(img,kernel_1,iterations=3)
plt.imshow(img2)
plt.title("椭圆")

#十字形
plt.subplot(224)
kernel_2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (9, 9))
img3 = cv2.erode(img,kernel_2,iterations=3)
plt.imshow(img3)
plt.title("十字形")

plt.show()

\qquad 运行结果:
形态转换

5.边缘检测

\qquad 使用cv2.Canny()函数进行边缘检测。

import cv2
import matplotlib.pyplot as plt

#读取图像
img = cv2.imread('F:/dog.jpg')
img_color = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#标题中文显示设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.subplot(221)
plt.imshow(img_color)
plt.title("原图")

plt.subplot(222)
canny1 = cv2.Canny(img_gray, 50, 150)
plt.imshow(canny1,cmap='gray')

plt.subplot(223)
canny2 = cv2.Canny(img_gray, 100, 200)
plt.imshow(canny2,cmap='gray')

plt.subplot(224)
canny3 = cv2.Canny(img_gray, 150, 250)
plt.imshow(canny3,cmap='gray')

plt.show()

\qquad 运行结果:
边缘检测

参考链接:Basic Operations on Images
\qquad \qquad Morphology
\qquad \qquad Drawing Functions in OpenCV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值