RGB图像转灰度图像的原理
簡介 ? ?
? ? 將彩色圖像轉化成為灰度圖像的過程成為圖像的灰度化處理。彩色圖像中的每個像素的顏色有R、G、B三個分量決定,而每個分量有255中值可取,這樣一個像素點可以有1600多萬(255*255*255)的顏色的變化范圍。而灰度圖像是R、G、B三個分量相同的一種特殊的彩色圖像,其一個像素點的變化范圍為255種,所以在數字圖像處理種一般先將各種格式的圖像轉變成灰度圖像以使后續的圖像的計算量變得少一些。灰度圖像的描述與彩色圖像一樣仍然反映了整幅圖像的整體和局部的色度和亮度等級的分布和特征
int main(int argc, char** argv) {Mat src = imread("G:\\opencv-4.1.1\\faceDete\\faceDete\\aaa.jpg", IMREAD_COLOR);Mat grey(src.rows, src.cols, CV_8UC1, Scalar(0));//每行循環處理for (int y = 0; y < src.rows; y++) {uchar* cp = src.ptr<uchar>(y);//獲取第y行像素的首地址uchar* gp = grey.ptr<uchar>(y);//獲取第y行像素的首地址for (int x = 0; x < src.cols; x++) {//列*gp = (15 * cp[0] + 75 * cp[1] + 38 * cp[2]) >> 7;cp += 3;gp++;}}imshow("src", src);imshow("grey", grey);waitKey(0);return 0; }以上代碼是在OPENCV中,RGB圖像轉換為灰度圖像的實現方式。
原理
RGB彩色圖像中,一種彩色由R(紅色),G(綠色),B(藍色)三原色按比例混合而成。圖像基本單元是一個像素,一個像素需要3塊表示,分別代表R,G,B,如果8位表示一個顏色,就由0-255區分不同亮度的某種原色。
一張9像素的8位RGB圖像,在計算機內存中的分布大概示意如下:
實際中數都是二進制形式的。
灰度圖像是用不同飽和度的黑色來表示每個圖像點,比如用8位 0-255數字表示“灰色”程度,每個像素點只需要一個灰度值,8位即可,這樣一個3X3的灰度圖,只需要9個byte就能保存。
RGB值和灰度的轉換,實際上是人眼對于彩色的感覺到亮度感覺的轉換,這是一個心理學問題,有一個公式:
Grey?= 0.299*R + 0.587*G + 0.114*B
根據這個公式,依次讀取每個像素點的R,G,B值,進行計算灰度值(轉換為整型數),將灰度值賦值給新圖像的相應位置,所有像素點遍歷一遍后完成轉換。一張500X500的圖像轉換為同樣大小的灰度圖需要進行25萬次上述公式的計算。進行優化是很有必要的,這個簡單的算法是O(n)復雜度的,應該是不能優化了(或者用并行進行優化,本文不涉及),但是Grey?= 0.299*R + 0.587*G + 0.114*B有更加高效的等價形式。可以通過將浮點數運算轉化為整數運算,整數運算轉換為位操作進行優化。
Grey?= 0.299*R + 0.587*G + 0.114*B
可以轉換為:
Grey?= (299*R + 587*G + 114*B + 500) /1000
整數運算會截斷小數部分,加上500是為了四舍五入(找兩個例子便可理解),減少精度損失。
這里的除法/?即使是整數除法計算也是很耗時,轉換為移位操作可以優化,那么怎么轉換為位操作?左右移位對應于乘除2的冪,為了把除法轉為右移操作,做如下處理:
? ? ?Grey?= 0.299*R + 0.587*G + 0.114*B
? ? Grey?=?(299*R+ 587*G + 114*B)÷ 1000
? ? Grey?=?(1024*299*R+ 1024*587*G + 1024*114*B)÷(1024*1000)
? ? Grey?=?(306176*R+601088*G + 116736*B)÷(1024*1000)
? ? Grey?=?(306.176*R+601.088*G + 116.736*B)÷(1024)
? ? Grey?=?(306*R+601*G + 116*B)÷(1024)//截斷誤差
? ? Grey?=?(306*R+601*G + 116*B)?>> 10;
誤差最大是多少?
??(0.176*255+0.088*255 + 0.736*255) ÷1024 = 255÷1024=0.249,可能會導致1個灰度值的波動。
?2-10位精度的公式如下:
Grey = (R*1 + G*2 + B*1) >> 2
Grey= (R*2 + G*5 + B*1) >> 3
Grey= (R*4 + G*10 + B*2) >> 4
Grey = (R*9 + G*19 + B*4) >> 5
Grey = (R*19 + G*37 + B*8) >> 6
Grey= (R*38 + G*75 + B*15) >> 7
Grey= (R*76 + G*150 + B*30) >> 8
Grey = (R*153 + G*300 + B*59) >> 9
Grey = (R*306 + G*601 + B*117) >> 10
Grey = (R*612 + G*1202 + B*234) >> 11
Grey = (R*1224 + G*2405 + B*467) >> 12
Grey= (R*2449 + G*4809 + B*934) >> 13
Grey= (R*4898 + G*9618 + B*1868) >> 14
Grey = (R*9797 + G*19235 + B*3736) >> 15
Grey = (R*19595 + G*38469 + B*7472) >> 16
Grey = (R*39190 + G*76939 + B*14943) >> 17
Grey = (R*78381 + G*153878 + B*29885) >> 18
Grey =(R*156762 + G*307757 + B*59769) >> 19
Grey= (R*313524 + G*615514 + B*119538) >> 20
?
總結
以上是生活随笔為你收集整理的RGB图像转灰度图像的原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言正则表达式】一个示例
- 下一篇: Pgpool安装部署(亲测可用)