Python+OpenCV實(shí)現(xiàn)六種常用圖像特效
圖像融合
按照一定的比例將兩張圖片融合在一起
addWeighted()方法:
- 參數(shù)1第一張圖片矩陣
- 參數(shù)2第一張圖片矩陣的權(quán)重
- 參數(shù)3第二張圖片矩陣
- 參數(shù)4第二張圖片矩陣的權(quán)重
- 融合之后的偏移量
進(jìn)行疊加的兩張圖片寬高應(yīng)該相同
疊加之后的像素偏移值如果填的話不要填太大,超過255會(huì)導(dǎo)致圖像偏白
import cv2 import cv2 as cv img = cv.imread("img/lena.jpg") tony = cv.imread("img/tony.jpg", ) # 修改lena圖片的寬高 融合圖像之前兩個(gè)圖片的寬高要保持一樣 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)) # 進(jìn)行疊加時(shí)的插值 dst = cv.addWeighted(new_img, 0.5, tony, 0.5, 0) cv.imshow("dst", dst) cv.waitKey(0) cv.destroyAllWindows()
灰度處理
一張彩色圖片通常是由BGR三個(gè)通道疊加而成
為了便于圖像特征識(shí)別,我們通常會(huì)將一張彩色圖片轉(zhuǎn)成灰度圖片來進(jìn)行分析,當(dāng)我們轉(zhuǎn)成灰色圖片之后,圖片中邊緣,輪廓特征仍然是能夠清晰看到的,況且在這種情況下我們僅需要對(duì)單一通道進(jìn)行分析,會(huì)簡化很多操作
1.前面說的可以讀取圖片時(shí)以灰度的方式讀取
import cv2 img = cv2.imread("img/lena.jpg", cv.IMREAD_GRAYSCALE)
2.BGR轉(zhuǎn)灰度圖
import cv2 img = cv2.imread("img/lena.jpg", cv.IMREAD_COLOR) # 將原圖的所有顏色轉(zhuǎn)成灰色 dstImg = cv2.cvtColor(img, cv.COLOR_BGR2GRAY) cv.imshow("dstImg", dstImg) cv.waitKey(0)
顏色反轉(zhuǎn)
灰度反轉(zhuǎn)
灰度圖中每一個(gè)像素點(diǎn)都是0~255組成,如果一個(gè)像素點(diǎn)為100,反轉(zhuǎn)之后就是255 - 100 = 155
import cv2 as cv img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR) # 將原圖的所有顏色轉(zhuǎn)成灰色 dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 獲取高度和寬度 height, width = dstImg.shape[0:2] # 遍歷每一個(gè)像素點(diǎn) for row in range(height): for col in range(width): # 255 - 每一個(gè)像素點(diǎn) = 反轉(zhuǎn)后的顏色 dstImg[row, col] = 255 - dstImg[row, col] cv.imshow("dstImg", dstImg) cv.waitKey(0)
彩色反轉(zhuǎn)
一樣的道理,彩色圖片有BGR三個(gè)顏色通道,每一個(gè)顏色都取反
255 - B = B1 255 - G = G1 255 - R = R1
import cv2 as cv img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR) # 將原圖的所有顏色轉(zhuǎn)成灰色 dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 獲取高度和寬度 height, width = dstImg.shape[0:2] # 遍歷每一個(gè)像素點(diǎn) for row in range(height): for col in range(width): # 255 - 每一個(gè)像素點(diǎn) = 反轉(zhuǎn)后的顏色 dstImg[row, col] = 255 - dstImg[row, col] cv.imshow("dstImg", dstImg) cv.waitKey(0)
馬賽克效果
馬賽克指現(xiàn)行廣為使用的一種圖像(視頻)處理手段,此手段將影像特定區(qū)域的色階細(xì)節(jié)劣化并造成色塊打亂的效果,因?yàn)檫@種模糊看上去有一個(gè)個(gè)的小格子組成,便形象的稱這種畫面為馬賽克。其目的通常是使之無法辨認(rèn)。
import cv2 # 讀取圖片 cv2讀取出的圖片都是一個(gè)二維矩陣 img = cv2.imread('./img/lena.jpg', cv2.IMREAD_COLOR) # 切片 兩個(gè)點(diǎn)的坐標(biāo)可以截取圖片 # x1:x2,y1:y2 截取眼睛部分 img1 = img[180:250, 180:310] # 獲取到高度和寬度 height, width = img1.shape[0:2] # 遍歷每一個(gè)像素點(diǎn) for row in range(height): for col in range(width): # 如果正好為10的倍數(shù)的行并且是10的倍數(shù)的列 if row % 10 == 0 and col % 10 == 0: # 獲取到這個(gè)像素點(diǎn)的bgr三原色 b, g, r = img1[row, col] # 遍歷這個(gè)像素點(diǎn)旁邊的100個(gè)像素點(diǎn) 都等于中間這個(gè)像素點(diǎn) 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的像素點(diǎn)內(nèi)所有像素點(diǎn)都與第一個(gè)像素點(diǎn)顏色一樣,毛玻璃效果為遍歷每一個(gè)像素點(diǎn),在該像素點(diǎn)附近隨機(jī)選取一個(gè)顏色值替換。
偏移量越大越模糊
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 # 遍歷每一個(gè)像素點(diǎn) for row in range(height): for col in range(width): # 定義不超過1的隨機(jī)值與offset相乘 index = int(random.random() * offset) # 獲取到隨機(jī)完的行號(hào)和列號(hào) 如果不超過總高度就使用隨機(jī)的行 如果超過就使用高度-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] # 轉(zhuǎn)為灰度圖 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) new_img = np.zeros_like(gray_img, np.uint8) # 遍歷每一個(gè)像素點(diǎn) for row in range(height): # 因?yàn)橐@取相鄰的像素點(diǎn) 防止下標(biāo)越界提前遍歷的時(shí)候?qū)挾?1 for col in range(width - 1): # 獲取像素點(diǎn)的像素值 gray0 = gray_img[row, col] # 獲取相鄰像素點(diǎn)的像素值 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()
到此這篇關(guān)于Python+OpenCV實(shí)現(xiàn)六種常用圖像特效的文章就介紹到這了,更多相關(guān)Python OpenCV圖像特效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中工廠模式的實(shí)現(xiàn)小結(jié)
工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,通過定義一個(gè)工廠類,將對(duì)象的實(shí)例化過程封裝起來,本文主要介紹了Python中工廠模式的實(shí)現(xiàn)小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11pandas讀取csv格式數(shù)據(jù)時(shí)header參數(shù)設(shè)置方法
本文主要介紹了pandas讀取csv格式數(shù)據(jù)時(shí)header參數(shù)設(shè)置方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02對(duì)Django的restful用法詳解(自帶的增刪改查)
今天小編就為大家分享一篇對(duì)Django的restful用法詳解(自帶的增刪改查),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Matlab中關(guān)于argmax、argmin函數(shù)的使用解讀
這篇文章主要介紹了Matlab中關(guān)于argmax、argmin函數(shù)的使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12python正則表達(dá)式之對(duì)號(hào)入座篇
正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對(duì)字符串的一種過濾邏輯2018-07-07python+playwright微軟自動(dòng)化工具的使用
這篇文章主要介紹了python+playwright微軟自動(dòng)化工具的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02使用Pycharm(Python工具)新建項(xiàng)目及創(chuàng)建Python文件的教程
這篇文章主要介紹了使用Pycharm(Python工具)新建項(xiàng)目及創(chuàng)建Python文件的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04基于python實(shí)現(xiàn)把圖片轉(zhuǎn)換成素描
這篇文章主要介紹了基于python實(shí)現(xiàn)把圖片轉(zhuǎn)換成素描,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11