首頁 > 軟體

Python+OpenCV實現六種常用影象特效

2022-05-14 19:01:23

影象融合

按照一定的比例將兩張圖片融合在一起

addWeighted()方法:

  • 引數1第一張圖片矩陣
  • 引數2第一張圖片矩陣的權重
  • 引數3第二張圖片矩陣
  • 引數4第二張圖片矩陣的權重
  • 融合之後的偏移量

進行疊加的兩張圖片寬高應該相同

疊加之後的畫素偏移值如果填的話不要填太大,超過255會導致影象偏白

import cv2
import cv2 as cv

img = cv.imread("img/lena.jpg")
tony = cv.imread("img/tony.jpg", )

# 修改lena圖片的寬高  融合影象之前兩個圖片的寬高要保持一樣
height, width = img.shape[0:2]
new_height = int(height * 1.5)
new_width = int(width * 2)
new_img = cv2.resize(img, (new_width, new_height))

# 進行疊加時的插值
dst = cv.addWeighted(new_img, 0.5, tony, 0.5, 0)
cv.imshow("dst", dst)

cv.waitKey(0)
cv.destroyAllWindows()

灰度處理

一張彩色圖片通常是由BGR三個通道疊加而成

為了便於影象特徵識別,我們通常會將一張彩色圖片轉成灰度圖片來進行分析,當我們轉成灰色圖片之後,圖片中邊緣,輪廓特徵仍然是能夠清晰看到的,況且在這種情況下我們僅需要對單一通道進行分析,會簡化很多操作

1.前面說的可以讀取圖片時以灰度的方式讀取

import cv2
img = cv2.imread("img/lena.jpg", cv.IMREAD_GRAYSCALE)

2.BGR轉灰度圖

import cv2

img = cv2.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 將原圖的所有顏色轉成灰色
dstImg = cv2.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("dstImg", dstImg)
cv.waitKey(0)

顏色反轉

灰度反轉

灰度圖中每一個畫素點都是0~255組成,如果一個畫素點為100,反轉之後就是255 - 100 = 155

import cv2 as cv

img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 將原圖的所有顏色轉成灰色
dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 獲取高度和寬度
height, width = dstImg.shape[0:2]
# 遍歷每一個畫素點
for row in range(height):
    for col in range(width):
        # 255 - 每一個畫素點 = 反轉後的顏色
        dstImg[row, col] = 255 - dstImg[row, col]

cv.imshow("dstImg", dstImg)
cv.waitKey(0)

彩色反轉

一樣的道理,彩色圖片有BGR三個顏色通道,每一個顏色都取反

255 - B = B1 255 - G = G1 255 - R = R1

import cv2 as cv

img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 將原圖的所有顏色轉成灰色
dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 獲取高度和寬度
height, width = dstImg.shape[0:2]
# 遍歷每一個畫素點
for row in range(height):
    for col in range(width):
        # 255 - 每一個畫素點 = 反轉後的顏色
        dstImg[row, col] = 255 - dstImg[row, col]

cv.imshow("dstImg", dstImg)
cv.waitKey(0)

馬賽克效果

馬賽克指現行廣為使用的一種影象(視訊)處理手段,此手段將影像特定區域的色階細節劣化並造成色塊打亂的效果,因為這種模糊看上去有一個個的小格子組成,便形象的稱這種畫面為馬賽克。其目的通常是使之無法辨認。

import cv2

# 讀取圖片  cv2讀取出的圖片都是一個二維矩陣
img = cv2.imread('./img/lena.jpg', cv2.IMREAD_COLOR)
# 切片 兩個點的座標可以擷取圖片
# x1:x2,y1:y2  擷取眼睛部分
img1 = img[180:250, 180:310]
# 獲取到高度和寬度
height, width = img1.shape[0:2]
# 遍歷每一個畫素點
for row in range(height):
    for col in range(width):
        # 如果正好為10的倍數的行並且是10的倍數的列
        if row % 10 == 0 and col % 10 == 0:
            # 獲取到這個畫素點的bgr三原色
            b, g, r = img1[row, col]
            # 遍歷這個畫素點旁邊的100個畫素點 都等於中間這個畫素點
            for i in range(10):
                for j in range(10):
                    img1[row + i, col + j] = b, g, r

cv2.imshow('img', img)

cv2.imwrite('msk_lena.jpg', img)
cv2.waitKey()

毛玻璃效果

毛玻璃效果和馬賽克效果相似,馬賽克是:比如4*4的畫素點內所有畫素點都與第一個畫素點顏色一樣,毛玻璃效果為遍歷每一個畫素點,在該畫素點附近隨機選取一個顏色值替換。

偏移量越大越模糊

import random

import cv2
import numpy as np

img = cv2.imread('./lena.jpg')
height, width = img.shape[0:2]
new_img = np.zeros_like(img, np.uint8)
# 定義偏移量
offset = 6
# 遍歷每一個畫素點
for row in range(height):
    for col in range(width):
        # 定義不超過1的隨機值與offset相乘
        index = int(random.random() * offset)
        # 獲取到隨機完的行號和列號   如果不超過總高度就使用隨機的行  如果超過就使用高度-1
        random_row = row + index if row + index < height else height - 1
        random_col = col + index if col + index < width else width - 1
        # 賦值顏色
        b, g, r = img[random_row, random_col]
        new_img[row, col] = b, g, r

cv2.imshow('img', img)
cv2.imshow('new_img', new_img)

cv2.waitKey()

浮雕效果

浮雕效果公式:new_gray = gray0-gray1+120

加120是為了增加灰度值

import cv2
import numpy as np

img = cv2.imread('./lena.jpg')
# 獲取高度寬度
height, width = img.shape[0:2]
# 轉為灰度圖
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

new_img = np.zeros_like(gray_img, np.uint8)
# 遍歷每一個畫素點
for row in range(height):
    # 因為要獲取相鄰的畫素點 防止下標越界提前遍歷的時候寬度-1
    for col in range(width - 1):
        # 獲取畫素點的畫素值
        gray0 = gray_img[row, col]
        # 獲取相鄰畫素點的畫素值
        gray1 = gray_img[row, col + 1]
        # 使用浮雕效果的公式
        new_gray = int(gray0) - int(gray1) + 120
        # 判斷新的灰度值是否越界
        if new_gray > 255:
            new_gray = 255
        elif new_gray < 0:
            new_gray = 0
        # 賦值
        new_img[row, col] = new_gray

cv2.imshow('img', img)
cv2.imshow('new_img', new_img)

cv2.waitKey()

到此這篇關於Python+OpenCV實現六種常用影象特效的文章就介紹到這了,更多相關Python OpenCV影象特效內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com