RGB图像转灰度图像的原理
簡(jiǎn)介 ? ?
? ? 將彩色圖像轉(zhuǎn)化成為灰度圖像的過程成為圖像的灰度化處理。彩色圖像中的每個(gè)像素的顏色有R、G、B三個(gè)分量決定,而每個(gè)分量有255中值可取,這樣一個(gè)像素點(diǎn)可以有1600多萬(wàn)(255*255*255)的顏色的變化范圍。而灰度圖像是R、G、B三個(gè)分量相同的一種特殊的彩色圖像,其一個(gè)像素點(diǎn)的變化范圍為255種,所以在數(shù)字圖像處理種一般先將各種格式的圖像轉(zhuǎn)變成灰度圖像以使后續(xù)的圖像的計(jì)算量變得少一些。灰度圖像的描述與彩色圖像一樣仍然反映了整幅圖像的整體和局部的色度和亮度等級(jí)的分布和特征
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));//每行循環(huán)處理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圖像轉(zhuǎn)換為灰度圖像的實(shí)現(xiàn)方式。
原理
RGB彩色圖像中,一種彩色由R(紅色),G(綠色),B(藍(lán)色)三原色按比例混合而成。圖像基本單元是一個(gè)像素,一個(gè)像素需要3塊表示,分別代表R,G,B,如果8位表示一個(gè)顏色,就由0-255區(qū)分不同亮度的某種原色。
一張9像素的8位RGB圖像,在計(jì)算機(jī)內(nèi)存中的分布大概示意如下:
實(shí)際中數(shù)都是二進(jìn)制形式的。
灰度圖像是用不同飽和度的黑色來表示每個(gè)圖像點(diǎn),比如用8位 0-255數(shù)字表示“灰色”程度,每個(gè)像素點(diǎn)只需要一個(gè)灰度值,8位即可,這樣一個(gè)3X3的灰度圖,只需要9個(gè)byte就能保存。
RGB值和灰度的轉(zhuǎn)換,實(shí)際上是人眼對(duì)于彩色的感覺到亮度感覺的轉(zhuǎn)換,這是一個(gè)心理學(xué)問題,有一個(gè)公式:
Grey?= 0.299*R + 0.587*G + 0.114*B
根據(jù)這個(gè)公式,依次讀取每個(gè)像素點(diǎn)的R,G,B值,進(jìn)行計(jì)算灰度值(轉(zhuǎn)換為整型數(shù)),將灰度值賦值給新圖像的相應(yīng)位置,所有像素點(diǎn)遍歷一遍后完成轉(zhuǎn)換。一張500X500的圖像轉(zhuǎn)換為同樣大小的灰度圖需要進(jìn)行25萬(wàn)次上述公式的計(jì)算。進(jìn)行優(yōu)化是很有必要的,這個(gè)簡(jiǎn)單的算法是O(n)復(fù)雜度的,應(yīng)該是不能優(yōu)化了(或者用并行進(jìn)行優(yōu)化,本文不涉及),但是Grey?= 0.299*R + 0.587*G + 0.114*B有更加高效的等價(jià)形式。可以通過將浮點(diǎn)數(shù)運(yùn)算轉(zhuǎn)化為整數(shù)運(yùn)算,整數(shù)運(yùn)算轉(zhuǎn)換為位操作進(jìn)行優(yōu)化。
Grey?= 0.299*R + 0.587*G + 0.114*B
可以轉(zhuǎn)換為:
Grey?= (299*R + 587*G + 114*B + 500) /1000
整數(shù)運(yùn)算會(huì)截?cái)嘈?shù)部分,加上500是為了四舍五入(找兩個(gè)例子便可理解),減少精度損失。
這里的除法/?即使是整數(shù)除法計(jì)算也是很耗時(shí),轉(zhuǎn)換為移位操作可以優(yōu)化,那么怎么轉(zhuǎn)換為位操作?左右移位對(duì)應(yīng)于乘除2的冪,為了把除法轉(zhuǎn)為右移操作,做如下處理:
? ? ?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)//截?cái)嗾`差
? ? Grey?=?(306*R+601*G + 116*B)?>> 10;
誤差最大是多少?
??(0.176*255+0.088*255 + 0.736*255) ÷1024 = 255÷1024=0.249,可能會(huì)導(dǎo)致1個(gè)灰度值的波動(dòng)。
?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
?
總結(jié)
以上是生活随笔為你收集整理的RGB图像转灰度图像的原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言正则表达式】一个示例
- 下一篇: Pgpool安装部署(亲测可用)