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

效果图:

 

 

 

posted @ 2020-01-21 15:54  天子骄龙  阅读(2901)  评论(0编辑  收藏  举报