毛玻璃其实就是磨砂玻璃,图像经过毛玻璃模糊效果后能够模糊的看清背后的风景,让人感觉有种朦胧美,让界面看上去很有层次感。
我们知道了图像马赛克效果是通过设置一个指定大小的像素块并将其中的所有像素点设置成统一值实现的。与图像的马赛克效果类似,图像的毛玻璃模糊效果也是通过修改像素点的颜色值来实现的,只不过是通过像素点随机替换来修改像素点的颜色值
如上图所示,左边为原图像的某5个像素点,我们假设随机替换值为5,即随机替换的范围为0-4。那么对于原图像上的某个像素点(x,y)的颜色值,我们将用原图像上的另一个像素点(x+随机值,y+随机值)的颜色值进行替换,即(x,y)=(x+随机值,y+随机值)。经过一系列像素点变换后,就得到了类似右边的图像,从而实现图像的毛玻璃模糊效果。
首先按照惯例使用imread()函数读取原图像的图像数据,并通过shape属性获取出图像的宽高信息。接着新建一个图像空模板,大小和形状与原图像保持一致。同时设置随机替换值,这里我们设置为5。然后开始遍历像素点,利用我们设置的随机替换值使用random模块的random.randint函数产生一个随机整数值,对像素点进行随机替换。
import cv2 import numpy as np import random img = cv2.imread("2013.jpg",1) #读取一张图片,彩色 cha=img.shape height,width,deep=cha cv2.imshow('img',img) dst=np.zeros(cha,np.uint8) randon_v=5 #用来替换的范围--这个值越大毛玻璃效果越明显 #防止越界 for m in range(height-randon_v): #毛玻璃效果 for n in range(width-randon_v): index=random.randint(1,randon_v) (b,g,r)=img[m+index,n+index] dst[m,n]=(b,g,r) cv2.imshow('dst',dst) cv2.waitKey()
右边的图就实现了图像的毛玻璃模糊效果,根据我们设置的随机替换值大小,毛玻璃的模糊程度会随之不同。随机替换值越大,毛玻璃模糊程度也就越大。由于我们未对边界值进行处理,因此经过毛玻璃模糊效果处理后的图像右边和下边都有黑色的边界。如果要处理,最简单的可以遍历黑色边界像素,用附近像素的颜色值进行填充即可。
效果图:
下面我把随机值改为10:
import cv2 import numpy as np import random img = cv2.imread("2013.jpg",1) #读取一张图片,彩色 cha=img.shape height,width,deep=cha cv2.imshow('img',img) dst=np.zeros(cha,np.uint8) randon_v=10 #用来替换的范围--这个值越大毛玻璃效果越明显 #防止越界 for m in range(height-randon_v): for n in range(width-randon_v): index=random.randint(1,randon_v) (b,g,r)=img[m+index,n+index] dst[m,n]=(b,g,r) cv2.imshow('dst',dst) cv2.waitKey()
效果图: