python-opencv-图像马赛克效果
马赛克效果是当前使用较为广泛的一种图像或视频处理手段,它将图像或视频中特定区域的色阶细节劣化并造成色块打乱的效果,因为这种模糊效果看上去是由一个个的小格子组成,我们便形象的称这种画面为马赛克。马赛克效果的主要目的通常是使特定区域无法辨认。
图像是由一个个的像素所组成的,并且每一个像素都有一个bgr值。要实现图像的马赛克效果,我们只需要设置一个像素块,并将该像素块中的所有像素都使用同一个bgr值来表示。
如上图所示,假设我们将马赛克大小设置为5个像素宽度,即设置一个5×5的像素块。所谓的马赛克效果,就是将这25个像素值全部处理成与矩阵第一个像素值相等的像素值,然后重新填充这个5×5的矩阵像素值即可。整个图像的马赛克只需要每次从左到右,从上到下,以步长为5个像素去处理每个5×5的像素矩阵,并且每次都将对应的25个像素值处理成与当前矩阵第一个像素值相等的像素值,直到将整个图像的像素处理完成即可生成整个图像的马赛克图像。
首先按照惯例使用imread()函数读取原图像的图像数据,使用shape属性获取图像的宽高信息。然后遍历像素点,由于我们设置的马赛克大小是5个像素宽度,为了防止宽高溢出,遍历像素点时宽高都需要减去5。每遍历25个像素点,即宽和高的当前坐标都能被5整除时,将该25个像素点值都处理成与当前像素块的第一个像素的像素值一致。
import cv2 import numpy as np img = cv2.imread("2013.jpg",1) #读取一张图片,彩色 cha=img.shape height,width,deep=cha cv2.imshow('img',img) for m in range(height-5): #马赛克 for n in range(width-5): if m%5==0 and n%5==0 : for i in range(5): for j in range(5): b,g,r=img[m,n] img[m+i,n+j]=(b,g,r) cv2.imshow('dst',img) cv2.waitKey() #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
效果图:
以上代码我们实现的是整个图像的马赛克效果,而在实际应用中,我们可能并不需要将整个图像进行马赛克处理,这时只需要遍历指定区域的像素点进行相同操作即可。不难发现的是,我们设置的马赛克像素块大小越大,马赛克效果越明显。
下面我把马赛克像素块改为10
import cv2 img = cv2.imread("2013.jpg",1) #读取一张图片,彩色 cha=img.shape height,width,deep=cha cv2.imshow('img',img) for m in range(height-10): #马赛克 for n in range(width-10): if m%10==0 and n%10==0 : for i in range(10): for j in range(10): b,g,r=img[m,n] img[m+i,n+j]=(b,g,r) cv2.imshow('dst',img) cv2.waitKey()
效果图: