0
点赞
收藏
分享

微信扫一扫

计算机视觉基础9---图像模糊

九点韶留学 2022-04-23 阅读 27

参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。



图像模糊处理概念

  • 图像模糊(图像平滑处理):处理图像中与周围差异较大的点,将其像素值调整为与周围点像素值近似的值;
  • 目的:消除图像噪声和边缘;

均值滤波

  1. 均值滤波:以当前点为中心,用其周围 N × N N\times{N} N×N个点像素值的平均值代替当前点的像素值;
  2. 用于计算平均值的 N × N N\times{N} N×N个点称为邻域,用于滤波计算的卷积核大小与邻域相同;
  3. 一个大小3×3的邻域为:
    [ 125 129 130 134 253 127 125 133 131 ] \begin{bmatrix}125 & 129 & 130 \\ 134 & 253 & 127 \\ 125 & 133 & 131\end{bmatrix} 125134125129253133130127131
  4. 对应的卷积核为:
    1 3 × 3 [ 111 111 111 ] \frac{1}{3\times{3}}\begin{bmatrix}111 \\ 111 \\ 111\end{bmatrix} 3×31111111111
  5. 中心点均值滤波值:
    中 心 滤 波 值 = ( 125 + 129 + 130 + 134 + 253 + 127 + 125 + 133 + 131 ) ÷ 9 = 143 中心滤波值=(125+129+130+134+253+127+125+133+131)÷9=143 =(125+129+130+134+253+127+125+133+131)÷9=143
  6. c v 2. b l u r ( ) cv2.blur() cv2.blur()函数实现均值滤波;
# 1.均值滤波
# 语法格式:dst = cv2.blur(src, ksize[, anchor[, borderType]])
# 参数说明:
# a.dst:滤波结果图像;
# b.src:原图像;
# c.ksize:卷积核大小,表示为(width, height),width和height通常设置为相同值,且为正数和奇数;
# d.anchor:锚点,默认值:(-1, -1), 表示锚点位于卷积核中心;
# e.borderType:边界值处理方式;
import cv2 as cv

img1 = cv.imread("dog.jpg")
img2 = cv.blur(img1, (3, 3))
img3 = cv.blur(img1, (5, 5))

cv.imshow("dog", img1)
cv.imshow("dog_blur1", img2)
cv.imshow("dog_blur2", img3)

cv.waitKey(0)

1

# 2.高斯滤波
# 语法格式:dst = cv2.GaussianBlur(src, ksize, sigmaX[, sigmaY[, borderType]])
# 参数说明:
# a.dst:滤波结果图像;
# b.src:原图像;
# c.ksize:卷积核大小,表示为(width, height),width和height通常设置为相同值,且为正数和奇数;
# d.sigmaX:水平方向的权重值;
# e.sigmaY:垂直方向的权重值;
# sigmaX = 0.3 × ((width - 1) × 0.5 - 1) + 0.8;
# sigmaY = 0.3 × ((height - 1) × 0.5 - 1) + 0.8;
import cv2 as cv

img1 = cv.imread("dog.jpg")
img2 = cv.GaussianBlur(img1, (3, 3), 0, 0)
img3 = cv.GaussianBlur(img1, (5, 5), 0, 0)

cv.imshow("dog", img1)
cv.imshow("dog_gauss1", img2)
cv.imshow("dog_gauss2", img3)

cv.waitKey(0)

2

# 3.方框滤波
# 方框滤波:以均值滤波以基础,可选择是否对滤波结果进行归一化;
# 如果进行归一化,则滤波结果为邻域内点的像素值之和的平均值;
# 如果不进行归一化,则滤波结果为像素值之和;
# 语法格式:
# dst = cv2.boxFilter(src, ddepth, ksize[, anchor[, normalize[, borderType]]])
# 参数说明:
# a.dst:滤波结果图像;
# b.src:原图像;
# c.ddepth:目标图像的深度,一般使用-1表示与原图像深度一致;
# d.ksize:卷积核大小,表示为(width, height),width和height通常设置为相同值,且为正数和奇数;
# e.anchor:锚点,默认值:(-1, -1), 表示锚点位于卷积核中心;
# f.normalize:True时,进行归一化;False时,不进行归一化;
# g.borderType:边界值处理方式;
import cv2 as cv

img1 = cv.imread("dog.jpg")
img2 = cv.boxFilter(img1, -1, (3, 3), normalize = False)
img3 = cv.boxFilter(img1, -1, (3, 3), normalize = True)
img4 = cv.boxFilter(img1, -1, (5, 5), normalize = False)
img5 = cv.boxFilter(img1, -1, (5, 5), normalize = True)

cv.imshow("dog", img1)
cv.imshow("dog_box_not_normal1", img2)
cv.imshow("dog_box_normal1", img3)
cv.imshow("dog_box_not_normal2", img4)
cv.imshow("dog_box_normal2", img5)

cv.waitKey(0)

3

# 4.中值滤波
# 中值滤波:将邻域内所有像素值排序,取中间值作为邻域中心点的像素值;
# 语法格式:dst = cv2.medianBlur(src, ksize)
# 参数说明:
# a.dst:转换后图像;
# b.src:转换前原图像;
# c.ksize:卷积核大小,大于1的奇数;
import cv2 as cv

img1 = cv.imread("dog.jpg")
img2 = cv.medianBlur(img1, 3)
img3 = cv.medianBlur(img1, 5)
img4 = cv.medianBlur(img1, 7)
img5 = cv.medianBlur(img1, 9)
img6 = cv.medianBlur(img1, 21)

cv.imshow("dog", img1)
cv.imshow("dog_median1", img2)
cv.imshow("dog_median2", img3)
cv.imshow("dog_median3", img4)
cv.imshow("dog_median4", img5)
cv.imshow("dog_median5", img6)

cv.waitKey(0)

4

# 5.双边滤波
# 双边滤波:在计算像素值的同时会考虑距离和色差信息,从而可在消除噪声的同时保护边缘信息;
# 在双边滤波时,如果像素点与当前点色差较小,赋予较大的权重;否则,赋予较小的权重;
# 语法格式:dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, borderType])
# 参数说明:
# a.dst:转换后图像;
# b.src:转换前原图像;
# c.d:以当前点为中心的邻域的直径,一般为5;
# d.sigmaColor:双边滤波选择的色差范围;
# e.sigmaSpace:空间坐标中的sigma值,值越大,表示越多的像素点参与滤波计算;
# d>0时,忽略sigmaSpace,由d决定邻域大小;否则d由sigmaSpace计算得出,与sigmaSpace成比例;
import cv2 as cv

img1 = cv.imread("dog.jpg")
img2 = cv.bilateralFilter(img1, 5, 100, 100)
img3 = cv.bilateralFilter(img1, 50, 100, 100)
img4 = cv.bilateralFilter(img1, 100, 100, 100)
img5 = cv.bilateralFilter(img1, 150, 100, 100)
img6 = cv.bilateralFilter(img1, 200, 100, 100)

cv.imshow("dog", img1)
cv.imshow("dog_bilateralFilter1", img2)
cv.imshow("dog_bilateralFilter2", img3)
cv.imshow("dog_bilateralFilter3", img4)
cv.imshow("dog_bilateralFilter4", img5)
cv.imshow("dog_bilateralFilter5", img6)

cv.waitKey(0)

5

# 6.2D卷积
# 2D卷积:可使用自定义的卷积核来执行滤波操作;
# 语法格式:dst = cv2.filter2D(src, ddepth, kernel[, anchor[, delta[, borderType]]])
# 参数说明:
# a.dst:转换后图像;
# b.src:转换前图像;
# c.ddepth:目标图像dst的深度,一般使用-1表示与原图像src一致;
# d.kernel:单通道卷积核;
# e.anchor:图像处理的锚点;
# f.delta:修正值,未省略时,加上该值作为最终的滤波结果;
# g.borderType:边界值处理方式;
import cv2 as cv
import numpy as np

img1 = cv.imread("dog.jpg")

k1 = np.array([[3, 3, 3, 3, 3], [3, 9, 9, 9, 3], [3, 11, 12, 13, 3], [3, 8, 8, 8, 3], [3, 3, 3, 3, 3]]) / 25
k2 = np.ones((5, 5), np.float32) / 25

img2 = cv.filter2D(img1, -1, k1)
img3 = cv.filter2D(img1, -1, k2)

cv.imshow("dog", img1)
cv.imshow("dog_filter1", img2)
cv.imshow("dog_filter2", img3)

cv.waitKey(0)

6

举报

相关推荐

0 条评论