图像阈值与平滑处理

Posted missdx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像阈值与平滑处理相关的知识,希望对你有一定的参考价值。

阈值处理

  ret, dst = cv2.threshold(src, thresh, maxval, type)  

  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • thresh: 阈值

  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

  • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

技术图片
import cv2 as cv
import matplotlib.pyplot as plt


cat = cv.imread(cat.jpg, cv.COLOR_BGR2GRAY)

ret, thresh1 = cv.threshold(cat, 127, 255, cv.THRESH_BINARY)
ret, thresh2 = cv.threshold(cat, 127, 255, cv.THRESH_BINARY_INV)
ret, thresh3 = cv.threshold(cat, 127, 255, cv.THRESH_TRUNC)
ret, thresh4 = cv.threshold(cat, 127, 255, cv.THRESH_TOZERO)
ret, thresh5 = cv.threshold(cat, 127, 255, cv.THRESH_TOZERO_INV)

titles = [Original Image, BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV]
images = [cat, thresh1, thresh2,thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i+1), plt.imshow(images[i], gray)
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
View Code

技术图片

 

 图像平滑

  • 均值滤波

均值滤波就是一个简单的平均卷积操作。假设你给的参数是(3, 3),那么他的意思就是用一个3*3大小的核去对图像做卷积,卷积核的值是1。,将他们加起来的值除以总数,在这里是9。然后将归一化的数替换原来的值。

1 1 1
1 1 1
1 1 1
import cv2 as cv
import matplotlib.pyplot as plt


img = cv.imread(lenaNoise.png)
cv.imshow(img, img)
# 均值滤波
blur = cv.blur(img, (3, 3))
cv.imshow(blur, blur)
cv.waitKey(0)
cv.destroyAllWindows

下图可以看出均值滤波可以去掉椒盐噪声。

技术图片

 

  • 方框滤波

方框滤波基本上和均值滤波一样,可以归一化。

技术图片
import cv2 as cv
import matplotlib.pyplot as plt


img = cv.imread(lenaNoise.png)
cv.imshow(img, img)
# 方框滤波
box = cv.boxFilter(img, -1, (3, 3), normalize = True)
cv.imshow(box, box)
cv.waitKey(0)
cv.destroyAllWindows
View Code

技术图片

 

 可以看出结果和均值滤波一样。下面讲一下函数 box = cv.boxFilter(img, -1, (3, 3), normalize = True) 

 -1 :表示结果通道数和输入图片通道数保持一致

 normalize = True :表示归一化结果再除以总数9。这就是为什么上面的结果和均值滤波一样的原因。

当 box = cv.boxFilter(img, -1, (3, 3), normalize = False)时,表示结果不出以总数。那么他们相加,如果值大于255,就令最后的值等于255.如果值小于255,就令最后的值保持不变。看结果:

技术图片

 

  • 高斯滤波

技术图片
import cv2 as cv
import matplotlib.pyplot as plt


img = cv.imread(lenaNoise.png)
G = cv.GaussianBlur(img, (5, 5), 0)
cv.imshow(G, G)
cv.waitKey(0)
cv.destroyAllWindows()
View Code

技术图片

 

  cv2.GaussianBlur(img, (5, 5), 1)  这里1代表标准差取1。

高斯滤波的卷积核满足高斯分布,更重视中间的值。 

  • 中值滤波

技术图片
import cv2 as cv


img = cv.imread(lenaNoise.png)
median = cv.medianBlur(img, 5)
cv.imshow(median, median)
cv.waitKey(0)
cv.destroyAllWindows()
View Code

技术图片

 

 中值滤波,顾名思义,去矩形范围中的中值。

  • 将多个结果拼接在一起

np.hstack

res = np.hstack((blur, G, median))
cv.imshow(all, res)
cv.waitKey(0)
cv.destroyAllWindows()

技术图片

 

以上是关于图像阈值与平滑处理的主要内容,如果未能解决你的问题,请参考以下文章

阈值与平滑处理

OpenCV图像处理应用(面向Python)之阈值与平滑处理

OpenCV图像处理应用(面向Python)之阈值与平滑处理

阈值与平滑处理

opencv学习图像阈值和平滑处理

Opencv-图像处理理论与实例操作