萬惡的馬賽克---OpenCV-Python開發(fā)指南(51)

馬賽克算法原理

在平常的生活中,我們會經(jīng)常看到各種馬賽克,比如某些宅男硬盤里的視頻馬賽克,有些直播犯罪嫌疑人的頭像遮罩馬賽克等??梢哉f在生活中,馬賽克無處不在。

因此,我們在學(xué)習(xí)OpenCV的同時(shí),也要熟練掌握馬賽克的應(yīng)用。下面,我們來了解馬賽克算法的幾種實(shí)現(xiàn)原理:

  1. 將需要馬賽克的圖像部位,全部賦值為該區(qū)域左上角的第一個(gè)像素值
  2. 將需要馬賽克的圖像部位像素隨機(jī)打亂
  3. 隨機(jī)用某一點(diǎn)代替需要馬賽克區(qū)域內(nèi)的所有像素值。

本篇將詳細(xì)介紹馬賽克的處理操作。

實(shí)現(xiàn)圖片中的馬賽克

這里,我們使用3實(shí)現(xiàn)原理,通過隨機(jī)用某一點(diǎn)代替需要馬賽克區(qū)域內(nèi)的所有像素值。具體代碼如下所示:

#馬賽克操作
def mosaic_effect(img):
    new_img = img.copy()
    h, w, n = img.shape
    size = 10#馬賽克大小
    for i in range(size, h - 1 - size, size):
        for j in range(size, w - 1 - size, size):
            i_rand = random.randint(i - size, i)
            j_rand = random.randint(j - size, j)
            new_img[i - size:i + size, j - size:j + size] = img[i_rand, j_rand, :]
    return new_img


if __name__ == "__main__":
    img = cv2.imread("49.jpg")
    cv2.imshow("0", img)
    cv2.imshow("1", mosaic_effect(img))
    cv2.waitKey()
    cv2.destroyAllWindows()

可以看到,我們代碼中設(shè)置的馬賽克大小為10,在這個(gè)區(qū)域內(nèi),隨機(jī)取一個(gè)像素點(diǎn),將所有的像素都設(shè)置成該隨機(jī)選取的像素值,這樣就達(dá)到了馬賽克的目的。而且對于原圖來說,輪廓看起來還是沒有變化的。效果如下:


1.png

跟蹤視頻人臉,將人臉用馬賽克遮擋

直接實(shí)現(xiàn)圖片中的馬賽克好像有點(diǎn)簡單,我們不妨結(jié)合前文的捕捉攝像頭的知識以及人臉檢測知識,將馬賽克用于視頻之中。話不多說,我們直接上代碼:

# 將視頻中的人臉替換成馬賽克
def mosaic_video_effect(img):
    height, width, n = img.shape
    new_img = img.copy()
    size = 20
    faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=2, minSize=(5, 5))
    for (x, y, w, h) in faces:
        for i in range(x + size, (x + w) - 1 - size, size):
            for j in range(y + size, (y + h) - 1 - size, size):
                if i - size > 0 and j + size < width and i + size < height and j - size > 0:
                    i_rand = random.randint(i - size, i)
                    j_rand = random.randint(j - size, j)
                    new_img[i - size:i + size, j - size:j + size] = img[i_rand, j_rand, :]
                else:
                    new_img[x:x + w, y:y + h] = [255, 255, 255]
    return new_img


if __name__ == "__main__":
    cap = cv2.VideoCapture(0)
    while (cap.isOpened()):
        ret, frame = cap.read()
        frame = mosaic_video_effect(frame)
        cv2.imshow('video', frame)
        c = cv2.waitKey(1)
        if c == 27:
            break
    cap.release()
    cv2.destroyAllWindows()

這里需要注意的是,因?yàn)槲覀冎徊糠终趽跞四?,所以并不是全屏馬賽克,而當(dāng)人臉移動到攝像頭邊緣時(shí),這個(gè)時(shí)候i - size,j-size可能小于0,j + size,i + size可能大于寬度高度,將導(dǎo)致數(shù)組越界報(bào)錯(cuò)。所以,為了避免人臉在邊緣時(shí),越界賦值,我們判斷在邊緣時(shí)直接遮擋白色馬賽克即可。


2.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容