馬賽克效果是當前使用較為廣泛的一種圖像或視頻處理手段,它將圖像或視頻中特定區域的色階細節劣化並造成色塊打亂的效果,因為這種模糊效果看上去是由一個個的小格子組成,我們便形象的稱這種畫面為馬賽克。馬賽克效果的主要目的通常是使特定區域無法辨認。
圖像是由一個個的像素所組成的,並且每一個像素都有一個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()
效果圖: