【Opencv实战】简易版“美颜”来啦—再见旧照片,Python一键美颜哦~
前言
🚀 作者 :“程序員梨子”
🚀 **文章簡介 **:本篇文章主要是寫了opencv的多份小程序!
🚀 **文章源碼獲取 **: 為了感謝每一個關注我的小可愛💓每篇文章的項目源碼都是無償分
享滴💓👇👇👇👇
點這里藍色這行字體自取,需要什么源碼記得說標題名字哈!私信我也可!
🚀 歡迎小伙伴們 點贊👍、收藏?、留言💬
正文
在學習Opencv的時候發現一些有趣的功能,簡短的代碼實現的效果還是挺不錯滴!
嘻嘻,學習完就立馬分享給大家啦!希望大家喜歡!
圖像的顏色空間
彩色圖像比灰度圖像擁有更豐富的信息,它的每個像素通常是由紅(R)、綠(G)、藍(B)3個
分量來表示的,每個分量介于0~255之間。
圖像中呈現的不同的顏色都是由R、G、B這3種顏色混合而成的。在OpenCV里面,彩色圖像擁有3
個顏色通道,但是通道的順序是可以變換的,RGB、BRG、BGR、GBR、GRB都有可能。
在讀取一幅圖像的時候,我們對于圖像的顏色通道排布并不清楚,因此需要先把圖像的顏色通道固
定下來,這就需要調用OpenCV的cvtColor()函數。
cvtColor()函數的功能是對圖像進行顏色空間變換,原型如下:
dst=cv2.cvtColor(src,?code?)
參數說明:
-
src:輸入圖像即要進行顏色空間變換的原圖像,可以是Mat類。
-
code:轉換的代碼或標識,即在此確定將什么制式的圖片轉換成什么制式的圖片,后面會詳細講述。
函數輸出進行顏色空間變換后存儲圖像。
通過調用cvtColor()函數,還可以將一幅彩色圖像轉換成灰度圖像下面會給大家演示的哈!
-
程序:彩色圖像轉灰度圖像示例
color2gray.py
#?-*-?coding:?UTF-8?-*-
import?numpy?as?np
import?cv2
#定義main()函數
def?main():
???img?=?cv2.imread('1.jpg')
???img2?=?cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
??????????????????????????????????????????#從彩色圖像轉化成灰度圖像
???cv2.imshow('img2.bmp?',?img2)
???cv2.waitKey(0)
if?__name__?==?'__main__':
???main()
注意:cvtColor()函數還可以通過改變參數cv2.COLOR_RGB2BRG等改變圖像顏色通道的排列順
序。另外也可以直接在讀取圖像函數imread時設置參數為0,直接將彩色圖像讀取為灰度圖像,
img = cv2.imread('1.jpg',0)。
2)彩色圖像的通道分離和混合
灰度圖像是單通道的,彩色圖像擁有R、G、B三個顏色通道。因此在圖像處理時,經常把顏色通
道分離,單獨處理一個通道的數組,然后再合并成一幅彩色圖像。
在實際的代碼編寫中,只需要調用OpenCV中的split()和merge()函數就可以實現圖像的通道分離和
合并。split()函數的功能是將多通道的矩陣分離成單通道矩陣,原型如下:
[,mv]=cv2.split?(src)參數說明:輸入參數為要進行分離的圖像矩陣,輸出參數為一個Mat數組。
merge()函數的功能是將多個單通道圖像合成一幅多通道圖像,原型如下:
dst=cv2.merge([,dst]?)參數說明:輸入參數可以是Mat數組,輸出為合并后的圖像矩陣。
3)彩色圖像的通道分離和混合程序示例
輸入一幅彩色圖像,通過上面的程序將其分割成R、G、B這3個通道的圖像并顯示。在分割前需要
先確定圖像的顏色通道分布,因此先調用cvtColor()函數固定顏色通道。
-
程序彩色圖像通道分離示例:
colorsplit.py
▲ colorsplit.py程序運行結果
可以看出,在圖像通道分離后,不同顏色通道的圖像顯示深淺不一,單通道的圖像呈現該顏色通道
的灰度信息。接下來把這3個顏色通道混合一下,在代碼中加入一行代碼:img3 =
cv2.merge([b,g,r]);,這樣img3又回到了原來輸入的彩色圖像樣式,顯示效果如圖3.11所示。
?
4)彩色圖像的二值化
圖像的二值化是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的黑白
效果。彩色圖像二值化最簡單的步驟如下:
彩色圖像轉灰度。
圖像閾值化處理,即像素值高于某閾值的像素賦值為255,反之為0。
其中,閾值的操作會調用OpenCV的threshold()函數。
threshold()函數聲明如下:
ret, dst = cv2.threshold(src, thresh, maxval, type);函數功能:實現圖像固定閾值的二值化。
參數說明:
-
src:輸入圖,只能輸入單通道圖像,通常來說為灰度圖。
-
dst:輸出圖。
-
thresh:閾值。
-
maxval:當像素值超過了閾值(或者小于閾值,根據type來決定)時所賦予的值。
-
type:二值化操作的類型,包含5種類型,即cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TRUNC、cv2.THRESH_TOZERO和cv2.THRESH_TOZERO_INV。
-
程序彩色圖像二值化示例:
colorthreshold.py
#?-*-?coding:?UTF-8?-*-
import?numpy?as?np
import?cv2
#定義main()函數
def?main():
???img?=?cv2.imread('1.jpg',0)
???thresh1,dst?=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
???????????????????????????????????????????????#圖像二值化
???cv2.imshow("dst",?dst)
???cv2.waitKey(0)
if?__name__?==?'__main__':
???main()
高于127的像素全部置為255,低于的全部置為0,得到如圖3.12所示的輸出結果。
?05 彩色圖像的遍歷
灰度圖像的遍歷按照訪問二維數組的方式得到坐標位置的像素。那對于彩色圖像呢?彩色圖像可以看出是3維數組,遍歷方式參見程序。
程序遍歷彩色圖像示例:color1.py
#?-*-?coding:?UTF-8?-*- import?numpy?as?np import?cv2 #定義main()函數 def?main():img?=?cv2.imread('1.jpg')????height,width,n?=?img.shape?#得到圖片的寬高和維度img2?=?img.copy()??#復制一個跟img相同的新圖片#寬高兩個維度遍歷圖片for?i?in?range(height):for?j?in?range(width):img2[i,?j][0]?=?0?#將第一個通道內的元素重新賦值cv2.imshow('img2.jpg',?img2)cv2.waitKey(0) if?__name__?==?'__main__':main()由于第一個通道里面的顏色信息全部變為了0:
▲圖 color1.py程序運行結果
在讀取不同通道的圖像像素值時,需要先確定圖像的通道排列是RGB還是BRG。
06 彩色圖像和灰度圖像的轉換
經過前面的學習,我們知道彩色圖像轉成灰度圖像有3種路徑:
-
imread讀取圖像的時候直接設置參數為0,彩色圖像自動被讀成灰度圖像。
-
調用cvtColor()函數,參數設置為cv2.COLOR_BGR2GRAY。
-
調用split()函數,可以將一幅彩色圖像分離成3個單通道的灰度圖像。
那么灰度圖像有沒有可能轉換成彩色圖像呢?
我們知道灰度圖像是單通道的,彩色圖像是RGB 3這個顏色通道。那么是否可以人為地增加圖像的
通道,偽造出另外兩個通道,而另外兩個通道可以隨機地賦值呢?
程序 增加圖像通道示例:
gray2color1.py
#?-*-?coding:?UTF-8?-*- import?numpy?as?np import?cv2 #定義main()函數 def?main():img?=?cv2.imread('gray1.jpg')????gray?=?np.zeros((512,?512,?3),?np.uint8)??#?生成一個空彩色圖像height,width,n?=?img.shape#圖像像素級遍歷for?i?in?range(height):for?j?in?range(width):gray[i,?j][0]?=?img[i,?j][0]gray[i,?j][1]?=?0gray[i,?j][2]?=?0cv2.imshow('gray.jpg',?gray)cv2.waitKey(0) =if?__name__?==?'__main__':main()上述程序新建了一個3通道的空的彩色圖像,然后將讀取的灰度圖像放在新建的彩色圖像的第一個
通道,也就是B通道,其他兩個通道賦值0,所以圖像整體呈現藍色,程序運行結果:
▲gray2color1.py程序運行結果
上述方法轉換的圖像顏色很單一。有沒有更加智能的方法呢?在攝像技術不是很成熟的時期,人們
給拍攝出來的黑白照片上色,發明了一種偽彩色圖像技術。在OpenCV里面,可以用預定義好的
Colormap(色度圖)來給圖片上色。
-
程序 偽彩色圖像技術示例:
gray2color2.py
程序運行結果。偽彩色圖像目前主要應用在對高度、壓力、密度、濕度等描述上,彩
色數據可視化。
總結
關注小編獲取更多精彩內容!記得點擊傳送門哈👇
記得三連哦! 如需打包好的源碼+素材免費分享滴!!傳送門
總結
以上是生活随笔為你收集整理的【Opencv实战】简易版“美颜”来啦—再见旧照片,Python一键美颜哦~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python整蛊合集】多份整蛊代码,发
- 下一篇: 【Python Turtle合集】有趣好