gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.cv2.cvtColor(src, code[, dst[, dstCn]])
该函数为转换图片的色彩空间,参数说明:
src:图片的numpy数组输入,
dst:输出图片,一般不用
code:目的色彩空间,这个参数实在太多,不能一一列举
dstCn:目的图片的通道,一般默认 返回值:灰度图片的数组
gray | hsv |
---|---|
对于彩色转灰度,有一个很著名的心理学公式:
Gray = R0.299 + G0.587 + B*0.114
H是色彩;
S是深浅, S = 0时,只有灰度;
V是明暗,表示色彩的明亮程度,但与光强无直接联系
应用:同HSI一样,可以用于偏光矫正、去除阴影、图像分割等。
参考资料:
由RGB到HSV颜色空间的理解
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
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]
plt.figure(figsize=[20,10])
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()
椒盐噪声又称为脉冲噪声,它是一种随机出现的白点或者黑点。 椒盐噪声 = 椒噪声 + 盐噪声 ,椒盐噪声的值为0(黑色)或者255(白色),这里假设为等概率的出现0或者255。如果一张图像的宽x高 = 10x10 ,那么它的像素共计100个。
import random
def PepperandSalt(src,percetage):
NoiseImg=src.copy()
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
if random.randint(0,1)<=0.5:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
img=cv2.imread('ZZF0.jpg')
img1=PepperandSalt(img,0.1)
cv2.imshow('PepperandSalt',img1)
cv2.waitKey(0)
特别注意这里需要用NoiseImg=src.copy(),而不是NoiseImg=src,否则原图img将被修改掉,这里涉及到python语言中深复制与浅复制的内容,后面再谈;
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。
通过使用函数random.gauss(means,sigma)生成均值为means,标准差为sigma的高斯白噪声。
def GaussianNoise(src,means,sigma,percetage):
NoiseImg=src.copy()
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
BGR = NoiseImg.shape[2]
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
for k in range(BGR):
NoiseImg[randX, randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)
if NoiseImg[randX, randY, k]< 0:
NoiseImg[randX, randY, k]=0
elif NoiseImg[randX, randY, k]>255:
NoiseImg[randX, randY, k]=255
return NoiseImg
img2 = GaussianNoise(img,5,5,0.5)
cv2.imshow('Gauss',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图 | 椒盐噪声 | 高斯噪声 |
---|---|---|
# 均值滤波:简单的平均卷积操作
blur = cv2.blur(img1, (3, 3))
# 方框滤波:基本和均值一样,可以选择归一化
box = cv2.boxFilter(img1,-1,(3,3), normalize=True)
# 高斯滤波:高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img1, (5, 5), 1)
# 中值滤波,相当于用中值代替(小BUG,参数只能取奇数)
median = cv2.medianBlur(img1, 3)
# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
对椒盐噪声图片滤波结果,可以看到中值滤波效果最好。
blur | box |
---|---|
aussian | median |
对高斯噪声进行滤波,还是中值滤波平滑效果好;
高斯滤波 | 中值滤波 |
---|---|
相关资料:
opencv图像滤波