相信好多人在開(kāi)始學(xué)習(xí)FPGA圖像處理的時(shí)候都是接觸的RGB轉(zhuǎn)灰度圖,Sobel圖像檢測(cè),直方圖均衡化這樣的算法。
然后在做直方圖均衡化的時(shí)候也是要先RGB轉(zhuǎn)灰度,然后再對(duì)灰度圖進(jìn)行直方圖均衡化,網(wǎng)上的課程也大多數(shù)都是這樣做的,不知道大家會(huì)不會(huì)產(chǎn)生一個(gè)疑問(wèn)就不能直接對(duì)RGB圖做直方圖均衡化嗎?
首先說(shuō)答案是不可以的。
我們來(lái)看看為什么。
先來(lái)看一段簡(jiǎn)單的代碼:
img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png') equ=cv2.equalizeHist(img) cv2.imshow('bgr', img) cv2.waitKey() cv2.destroyAllWindows()
讀取一張圖片,然后對(duì)其做直方圖均衡化,很簡(jiǎn)單,但是OpenCV報(bào)錯(cuò)了。
報(bào)錯(cuò)說(shuō)直方圖均衡化這個(gè)函數(shù)的參數(shù)應(yīng)該是CV_8UC1,那么我們將RGB通道給分離出來(lái)分別進(jìn)行直方圖均衡化不就好了嗎,說(shuō)干就干。
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é)果給合并起來(lái)。
ps:opencv讀取的圖片默認(rèn)是BGR格式的,而不是RGB格式的。
來(lái)看看效果吧。
一個(gè)原圖,一個(gè)效果圖,可以發(fā)現(xiàn)效果很差,把我們?cè)鹊纳识冀o打亂了。特別是圖像的上半部分直接顏色都變了。
那么這是為啥呢。
這個(gè)就需要了解一下什么是色彩空間了。
色彩是一種感性的認(rèn)識(shí),科學(xué)家們?yōu)榱巳ケ硎旧示桶l(fā)明了許多的色彩空間,比如RGB,YUV,HSV,HSI,HSL等多種表示方式,每一種使用范圍也不太一樣。
比如RGB色彩空間把圖像用紅色,綠色,藍(lán)色來(lái)表示,但是這種色彩空間把圖像的亮度和色度混在了一起進(jìn)行表示,也就是不區(qū)分luma和chroma 的值,這樣在對(duì)其中某一個(gè)進(jìn)行變換的時(shí)候就會(huì)把另外一個(gè)也進(jìn)行了變換。比如在進(jìn)行直方圖均衡化的時(shí)候是對(duì)luma進(jìn)行操作的,由于RGB混在一起的表示形式就會(huì)把chroma也給搞亂掉,這樣就表現(xiàn)出來(lái)了上圖的效果。
如果是對(duì)圖像進(jìn)行線(xiàn)性變換的話(huà)還能恢復(fù)過(guò)來(lái),如果是非線(xiàn)性的變化那豈不是搞不回來(lái)了,把另外一個(gè)徹底搞亂掉了。
而YUV色彩空間用Y來(lái)表示亮度,用UV表示色度,這樣單獨(dú)對(duì)Y通道進(jìn)行直方圖均衡化就可以了,不會(huì)對(duì)色度產(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,然后對(duì)Y通道進(jìn)行直方圖均衡化,最后再轉(zhuǎn)回BGR色彩空間。
來(lái)看看效果圖。
直方圖均衡化后比直接RGB直方圖的效果要好很多。
最后這個(gè)對(duì)比圖是通過(guò)matplotlib畫(huà)出來(lái)的,需要注意的是matplotlib默認(rèn)是RGB模式的,所以需要將BGR轉(zhuǎn)為RGB才能正常顯示出來(lái)。
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)注
1650文章
22207瀏覽量
626929 -
圖像處理
+關(guān)注
關(guān)注
27文章
1337瀏覽量
58910 -
RGB
+關(guān)注
關(guān)注
4文章
818瀏覽量
61042 -
直方圖
+關(guān)注
關(guān)注
0文章
21瀏覽量
8101
原文標(biāo)題:FPGA圖像處理--為什么不直接對(duì)RGB圖像做處理呢?
文章出處:【微信號(hào):FPGA開(kāi)源工坊,微信公眾號(hào):FPGA開(kāi)源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
DSP國(guó)產(chǎn)教學(xué)實(shí)驗(yàn)箱_嵌入式教程:5-7 直方圖均衡化
基于FPGA的圖像直方圖均衡處理
【干貨】基于FPGA的圖像處理(圖像增強(qiáng))之直方圖均衡
玩轉(zhuǎn)Zynq連載47——[ex66] MT9V034攝像頭的圖像直方圖均衡處理
labview做直方圖均衡化時(shí)閾值跟隨圖像灰度值范圍變化的部分如何編寫(xiě)?
TI C6000教學(xué)實(shí)驗(yàn)箱操作教程:5-8 直方圖均衡化(LCD顯示)
保持圖像細(xì)節(jié)的直方圖均衡算法
直方圖均衡化_《OpenCV3編程入門(mén)》書(shū)本配套源代碼
直方圖均衡化_OpenCV3編程入門(mén)-源碼例程
MATLAB如何實(shí)現(xiàn)圖像增強(qiáng)灰度變換直方圖均衡匹配

直方圖均衡化的原理及OpenCV的算法和代碼實(shí)現(xiàn)免費(fèi)下載

直接灰度變換和直方圖均衡的數(shù)字圖像處理實(shí)驗(yàn)資料免費(fèi)下載

評(píng)論