相信好多人在開始學習FPGA圖像處理的時候都是接觸的RGB轉灰度圖,Sobel圖像檢測,直方圖均衡化這樣的算法。
然后在做直方圖均衡化的時候也是要先RGB轉灰度,然后再對灰度圖進行直方圖均衡化,網上的課程也大多數都是這樣做的,不知道大家會不會產生一個疑問就不能直接對RGB圖做直方圖均衡化嗎?
首先說答案是不可以的。
我們來看看為什么。
先來看一段簡單的代碼:
img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png') equ=cv2.equalizeHist(img) cv2.imshow('bgr', img) cv2.waitKey() cv2.destroyAllWindows()
讀取一張圖片,然后對其做直方圖均衡化,很簡單,但是OpenCV報錯了。
報錯說直方圖均衡化這個函數的參數應該是CV_8UC1,那么我們將RGB通道給分離出來分別進行直方圖均衡化不就好了嗎,說干就干。
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通道進行了分離,然后分別進行直方圖均衡化,最后再將結果給合并起來。
ps:opencv讀取的圖片默認是BGR格式的,而不是RGB格式的。
來看看效果吧。
一個原圖,一個效果圖,可以發現效果很差,把我們原先的色彩都給打亂了。特別是圖像的上半部分直接顏色都變了。
那么這是為啥呢。
這個就需要了解一下什么是色彩空間了。
色彩是一種感性的認識,科學家們為了去表示色彩就發明了許多的色彩空間,比如RGB,YUV,HSV,HSI,HSL等多種表示方式,每一種使用范圍也不太一樣。
比如RGB色彩空間把圖像用紅色,綠色,藍色來表示,但是這種色彩空間把圖像的亮度和色度混在了一起進行表示,也就是不區分luma和chroma 的值,這樣在對其中某一個進行變換的時候就會把另外一個也進行了變換。比如在進行直方圖均衡化的時候是對luma進行操作的,由于RGB混在一起的表示形式就會把chroma也給搞亂掉,這樣就表現出來了上圖的效果。
如果是對圖像進行線性變換的話還能恢復過來,如果是非線性的變化那豈不是搞不回來了,把另外一個徹底搞亂掉了。
而YUV色彩空間用Y來表示亮度,用UV表示色度,這樣單獨對Y通道進行直方圖均衡化就可以了,不會對色度產生影響。
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色彩空間轉為YUV,然后對Y通道進行直方圖均衡化,最后再轉回BGR色彩空間。
來看看效果圖。
直方圖均衡化后比直接RGB直方圖的效果要好很多。
最后這個對比圖是通過matplotlib畫出來的,需要注意的是matplotlib默認是RGB模式的,所以需要將BGR轉為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
+關注
關注
1645文章
22049瀏覽量
618347 -
圖像處理
+關注
關注
27文章
1329瀏覽量
58043 -
RGB
+關注
關注
4文章
807瀏覽量
59928 -
直方圖
+關注
關注
0文章
21瀏覽量
8021
原文標題:FPGA圖像處理--為什么不直接對RGB圖像做處理呢?
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于FPGA的圖像直方圖均衡處理
【干貨】基于FPGA的圖像處理(圖像增強)之直方圖均衡
玩轉Zynq連載47——[ex66] MT9V034攝像頭的圖像直方圖均衡處理
labview做直方圖均衡化時閾值跟隨圖像灰度值范圍變化的部分如何編寫?
TI C6000教學實驗箱操作教程:5-8 直方圖均衡化(LCD顯示)
保持圖像細節的直方圖均衡算法
MATLAB如何實現圖像增強灰度變換直方圖均衡匹配

直方圖均衡化的原理及OpenCV的算法和代碼實現免費下載

評論