opencv学习(二)图像阈值和平滑处理
图像阈值
ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输入图,只能输入单通道图像,通常来说为灰度图
dst: 输出图
thresh: 阈值
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type:二值化操作的类型,包含以下5种类型:
cv2.THRESH_BINARY: 超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INV :THRESH_BINARY的反转
cv2.THRESH_TRUNC :大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO :大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INV :THRESH_TOZERO的反转
python代码及其效果图如下:
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
img=cv2.imread('E:/opencv/open-cv/2-7/dog.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, 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([])
plt.show()
设置阈值,画出对应图像如下图:
可以看出,不同的type其得到的图差距很大。
图像平滑处理
2.1 读取图像
读取了加噪声的图像,方便后面比较。
img = cv2.imread('E:/opencv/open-cv/2-7/lenaNoise.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 均值滤波
cv2.blur(img,ksize) 均值滤波
img:原图像
ksize:核大小
原理:它只取内核区域下所有像素的平均值并替换中心元素。
特征:核中区域贡献率相同。
作用:滤除椒盐噪声效果比较好。
blur = cv2.blur(img, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
对比原来其效果如图所示:
2.3 方框滤波
cv2.boxFilter(img,-1,ksize,normalize=True)
注意函数区别:当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示。
box = cv2.boxFilter(img,-1,(3,3), normalize=True)
cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
normalize=True |
normalize=False |
其效果对比如如上所示。
2.4 高斯滤波
cv2.GuassianBlur(img, ksize,sigmaX,sigmaY)
其中sigmaX,sigmaY分别表示X,Y方向的标准偏差。如果仅指定了sigmaX,则sigmaY与sigmaX相同。
aussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.5 中值滤波
cv2.medianBlur(img, k)
原理:imgs为原图像,k为方框的尺寸,相当于将方框内的个值进行排序,取中值作为当前值。
python程序和效果图如下:
median = cv2.medianBlur(img, 5) # 中值滤波
cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.6 四种滤波算法对比
python代码和图像如下:
res = np.hstack((blur,box1,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()