相信好多人在開始學(xué)習(xí)FPGA圖像處理的時候都是接觸的RGB轉(zhuǎn)灰度圖,Sobel圖像檢測,直方圖均衡化這樣的算法。
然后在做直方圖均衡化的時候也是要先RGB轉(zhuǎn)灰度,然后再對灰度圖進(jìn)行直方圖均衡化,網(wǎng)上的課程也大多數(shù)都是這樣做的,不知道大家會不會產(chǎn)生一個疑問就不能直接對RGB圖做直方圖均衡化嗎?
首先說答案是不可以的。
我們來看看為什么。
先來看一段簡單的代碼:
img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png') equ=cv2.equalizeHist(img) cv2.imshow('bgr', img) cv2.waitKey() cv2.destroyAllWindows()
讀取一張圖片,然后對其做直方圖均衡化,很簡單,但是OpenCV報錯了。
報錯說直方圖均衡化這個函數(shù)的參數(shù)應(yīng)該是CV_8UC1,那么我們將RGB通道給分離出來分別進(jìn)行直方圖均衡化不就好了嗎,說干就干。
img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png') b, g, r = cv2.split(img) equ_b = cv2.equalizeHist(b) equ_g = cv2.equalizeHist(g) equ_r = cv2.equalizeHist(r) equ = cv2.merge([equ_b, equ_g, equ_r]) cv2.imshow('bgr', img) cv2.imshow('bgr_equ', equ) cv2.waitKey() cv2.destroyAllWindows()
上述代碼將BGR通道進(jìn)行了分離,然后分別進(jìn)行直方圖均衡化,最后再將結(jié)果給合并起來。
ps:opencv讀取的圖片默認(rèn)是BGR格式的,而不是RGB格式的。
來看看效果吧。
一個原圖,一個效果圖,可以發(fā)現(xiàn)效果很差,把我們原先的色彩都給打亂了。特別是圖像的上半部分直接顏色都變了。
那么這是為啥呢。
這個就需要了解一下什么是色彩空間了。
色彩是一種感性的認(rèn)識,科學(xué)家們?yōu)榱巳ケ硎旧示桶l(fā)明了許多的色彩空間,比如RGB,YUV,HSV,HSI,HSL等多種表示方式,每一種使用范圍也不太一樣。
比如RGB色彩空間把圖像用紅色,綠色,藍(lán)色來表示,但是這種色彩空間把圖像的亮度和色度混在了一起進(jìn)行表示,也就是不區(qū)分luma和chroma 的值,這樣在對其中某一個進(jìn)行變換的時候就會把另外一個也進(jìn)行了變換。比如在進(jìn)行直方圖均衡化的時候是對luma進(jìn)行操作的,由于RGB混在一起的表示形式就會把chroma也給搞亂掉,這樣就表現(xiàn)出來了上圖的效果。
如果是對圖像進(jìn)行線性變換的話還能恢復(fù)過來,如果是非線性的變化那豈不是搞不回來了,把另外一個徹底搞亂掉了。
而YUV色彩空間用Y來表示亮度,用UV表示色度,這樣單獨對Y通道進(jìn)行直方圖均衡化就可以了,不會對色度產(chǎn)生影響。
import cv2 img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png') y, u, v = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2YUV)) b, g, r = cv2.split(img) equ_b = cv2.equalizeHist(b) equ_g = cv2.equalizeHist(g) equ_r = cv2.equalizeHist(r) equ_y = cv2.equalizeHist(y) yuv = cv2.merge([equ_y, u, v]) yuv = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR) equ = cv2.merge([equ_b, equ_g, equ_r]) # stacking images side-by-side cv2.imshow('rgb', img) cv2.imshow('bgr_equ', equ) cv2.imshow('yuv_equ',yuv) cv2.waitKey() cv2.destroyAllWindows()
上述代碼將BGR色彩空間轉(zhuǎn)為YUV,然后對Y通道進(jìn)行直方圖均衡化,最后再轉(zhuǎn)回BGR色彩空間。
來看看效果圖。
直方圖均衡化后比直接RGB直方圖的效果要好很多。
最后這個對比圖是通過matplotlib畫出來的,需要注意的是matplotlib默認(rèn)是RGB模式的,所以需要將BGR轉(zhuǎn)為RGB才能正常顯示出來。
import matplotlib.pyplot as plt img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) equ = cv2.cvtColor(equ, cv2.COLOR_BGR2RGB) yuv = cv2.cvtColor(yuv, cv2.COLOR_BGR2RGB) plt.figure() plt.subplot(1, 3, 1) plt.imshow(img) plt.title("img") plt.subplot(1, 3, 2) plt.imshow(equ) plt.title("bgr_equ") plt.subplot(1, 3, 3) plt.title("yuv_euq") plt.imshow(yuv) plt.show()
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602977 -
圖像處理
+關(guān)注
關(guān)注
27文章
1289瀏覽量
56722 -
RGB
+關(guān)注
關(guān)注
4文章
798瀏覽量
58461 -
直方圖
+關(guān)注
關(guān)注
0文章
20瀏覽量
7882
原文標(biāo)題:FPGA圖像處理--為什么不直接對RGB圖像做處理呢?
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論