个人学习向——opencv-2图像变换、阈值、平滑

1 彩色图像变换

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:目的图片的通道,一般默认 返回值:灰度图片的数组

grayhsv

1.1 灰度模型

对于彩色转灰度,有一个很著名的心理学公式:

Gray = R0.299 + G0.587 + B*0.114

1.2hsv模型

在这里插入图片描述
这个模型就是按色彩、深浅、明暗来描述的。

H是色彩;

S是深浅, S = 0时,只有灰度;

V是明暗,表示色彩的明亮程度,但与光强无直接联系

在这里插入图片描述
应用:同HSI一样,可以用于偏光矫正、去除阴影、图像分割等。

参考资料:
由RGB到HSV颜色空间的理解
OpenCV图像处理专栏一 | 盘点常见颜色空间互转

2 图像阈值

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()

在这里插入图片描述

3 图像平滑

3.1 椒盐噪声

椒盐噪声又称为脉冲噪声,它是一种随机出现的白点或者黑点。 椒盐噪声 = 椒噪声 + 盐噪声 ,椒盐噪声的值为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语言中深复制与浅复制的内容,后面再谈;

3.2 高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。

通过使用函数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()
原图椒盐噪声高斯噪声

3.3 图像滤波

# 均值滤波:简单的平均卷积操作
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()

对椒盐噪声图片滤波结果,可以看到中值滤波效果最好。

blurbox
aussianmedian

对高斯噪声进行滤波,还是中值滤波平滑效果好;

高斯滤波中值滤波

相关资料:
opencv图像滤波

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值