在简书其实已经分享了几百篇文章了,最近将想挑选些文章分享到其他平台。这时才发现可以选择的文章并不多。主要因为自己对些文章都不够满意,问题主要出于两个方面,第一个方面自己当时对某些知识点认识不够清楚,所以造成表达语言含糊不清,第二原因就是自己表达能力有限,而且写作功底和逻辑性都比较差,所以最近想对自己已经分享的文章进行整理,基于现有水平进行完善。
中值平滑定义
虽然中值平滑与通过卷积进行平滑的方式有所不同,但计算方式也是一种通过邻域计算其平滑,在中值平滑计算的不是加权求和,而是对邻域中的像素点按灰度值进行排序后,选择该组像素灰度值的中值作为输出的灰度值。
中值平滑作用
中值滤波主要是用于消除椒盐噪声。那么什么是椒盐噪声呢,所谓椒盐噪声是在图像传输系统中由于解码误差等原因所产生的孤立黑点和白点。
代码时间,先通过代码创建一个带有椒盐噪声的图片
椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。 椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。
def salt_noise(image,number):
rows,cols = image.shape
salt_image = np.copy(image)
for i in range(number):
rand_r = random.randint(0,rows-1)
rand_c = random.randint(0,cols-1)
salt_image[rand_r,rand_c] = 255
return salt_image
椒盐噪音图片
然后我们再用代码实现一下中值平滑,接下来对于代码给予一定说明。其实代码并不难,而且中值平滑背后的原理也比较简单易懂。
def media_blur(image,win_size):
rows,cols = image.shape
win_H,win_W = win_size
half_win_H = (win_H - 1)/2
half_win_W = (win_W - 1)/2
media_blur_image = np.zeros(image.shape,image.dtype)
for r in range(rows):
for c in range(cols):
r_Top = 0 if r-half_win_H < 0 else r-half_win_H
r_Bottom = rows - 1 if r+half_win_H > rows-1 else r+ half_win_H
c_Left = 0 if c-half_win_W < 0 else c-half_win_W
c_Right = cols - 1 if c+half_win_W > cols-1 else c+half_win_W
region = image[r_Top:r_Bottom+1,c_Left:c_Right+1]
media_blur_image[r][c] = np.median(region)
return media_blur_image
首先 media blur 这个方法接收两个参数,第一个参数是要处理的图像,而第二个参数是窗口的大小。这些需要说明一下 win_size 是一个元组类型数据,也就是(w,h)。首先我们定义一个大小为原图宽高大小全为 0 图像
def main():
img = cv2.imread("image/cat_small.png",0)
salt_image = salt_noise(img,100)
media_blur_image = media_blur(salt_image,(3,3))
while(1):
cv2.imshow("salt image",media_blur_image)
k = cv2.waitKey(0)
if k==27:
break
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
中值滤波后效果