opencv之顏色過(guò)濾只留下圖片中的紅色區(qū)域操作
如圖,這次需要在圖片中找到卷尺的紅色刻度,所以需要對(duì)圖像做過(guò)濾,只留下紅色部分。
一開(kāi)始的想法是分別找到RGB值,然后找到紅色區(qū)域的部分保留就可以了,不過(guò)好像很難確定紅色區(qū)域的RGB取值范圍,所以要把圖片轉(zhuǎn)化到HSV空間中去。
在opencv中直接使用cvCvtColor函數(shù)就可以啦。
IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );
cvCvtColor(image,hsv,CV_BGR2HSV);
opencv 的H范圍是0~180,紅色的H范圍大概是(0~8)∪(160,180) ,S是飽和度,一般是大于一個(gè)值,S過(guò)低就是灰色(參考值S>80),V是亮度,過(guò)低就是黑色,過(guò)高就是白色(參考值220>V>50)。
所以接下來(lái)要做的就是遍歷圖像,獲取圖像每個(gè)像素點(diǎn)的H,S,V分量,然后做判斷,滿足條件的就保留,不滿足的就賦值為黑色。
我是用opencv中的IplImage來(lái)存儲(chǔ)圖片的。
IplImage獲取像素點(diǎn)的方式如下:
CvScalar s_hsv = cvGet2D(hsv, j, i);//獲取像素點(diǎn)為(i, j)點(diǎn)的HSV的值,i是width值,j是height值
IplImage對(duì)像素點(diǎn)賦值的方式如下:
CvScalar s;
cvSet2D(hsv, j ,i, s);//對(duì)(i,j)處的像素點(diǎn)賦值
分別取得H,S,V分量,注意圖像轉(zhuǎn)化的時(shí)候BGR2HSV,所以s.val[0]是B或H的值,s.val[1]是G或S的值,s.val[2]則是R或V的值。
因?yàn)閹煹芟矚g用CvMat,所以輸入都改成了CvMat,使用的時(shí)候inputImage是希望過(guò)濾的圖片,outputImage則為輸出圖片,因?yàn)閛utputImage會(huì)在函數(shù)中進(jìn)行空間申請(qǐng)與賦值,所以傳入?yún)?shù)的時(shí)候直接把它設(shè)成NULL就可以了。
另外要注意一點(diǎn),因?yàn)槭菍?duì)彩色圖像做實(shí)驗(yàn),所以如果傳入的圖片不是3通道的彩色圖片,那么就會(huì)出內(nèi)存錯(cuò)誤。
以下打開(kāi)圖片或創(chuàng)建圖片的方式都是單通道方式,會(huì)出現(xiàn)內(nèi)存錯(cuò)誤。
IplImage *input = cvLoadImage(path, 0), CvMat* M = cvCreateMat(4,4,CV_32FC1); //或是8UC1, 因?yàn)镃1表示nChannel = 1,也就是單通道 void colorFilter(CvMat *inputImage, CvMat *&outputImage) { int i, j; IplImage* image = cvCreateImage(cvGetSize(inputImage), 8, 3); cvGetImage(inputImage, image); IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 ); cvCvtColor(image,hsv,CV_BGR2HSV); int width = hsv->width; int height = hsv->height; for (i = 0; i < height; i++) for (j = 0; j < width; j++) { CvScalar s_hsv = cvGet2D(hsv, i, j);//獲取像素點(diǎn)為(j, i)點(diǎn)的HSV的值 /* opencv 的H范圍是0~180,紅色的H范圍大概是(0~8)∪(160,180) S是飽和度,一般是大于一個(gè)值,S過(guò)低就是灰色(參考值S>80), V是亮度,過(guò)低就是黑色,過(guò)高就是白色(參考值220>V>50)。 */ CvScalar s; if (!(((s_hsv.val[0]>0)&&(s_hsv.val[0]<8)) || (s_hsv.val[0]>120)&&(s_hsv.val[0]<180))) { s.val[0] =0; s.val[1]=0; s.val[2]=0; cvSet2D(hsv, i ,j, s); } } outputImage = cvCreateMat( hsv->height, hsv->width, CV_8UC3 ); cvConvert(hsv, outputImage); cvNamedWindow("filter"); cvShowImage("filter", hsv); waitKey(0); cvReleaseImage(&hsv); }
關(guān)于函數(shù)還有一點(diǎn)要說(shuō)明,H分量我取得是(0,8),(120,180),S與V分量沒(méi)有做篩選,如果按照注釋部分的進(jìn)行篩選結(jié)果不是很好。
結(jié)果如圖:
補(bǔ)充知識(shí):opencv實(shí)現(xiàn)圖像去除單一顏色背景
思路
因?yàn)楸尘笆枪潭伾?,很容易篩選出背景,然后將其設(shè)為白色完全透明即可。
代碼
#coding=utf-8 import cv2 as cv bg_color = [197, 102, 6] threshold = 3000 def calc_diff(pixel): ''' 計(jì)算pixel與背景的離差平方和,作為當(dāng)前像素點(diǎn)與背景相似程度的度量 ''' return (pixel[0]-bg_color[0])**2 + (pixel[1]-bg_color[1])**2 + (pixel[2]-bg_color[2])**2 def remove_bg(): image_path = './logo.png' logo = cv.imread(image_path) logo = cv.cvtColor(logo, cv.COLOR_BGR2BGRA) #將圖像轉(zhuǎn)成帶透明通道的BGRA格式 h, w = logo.shape[0:2] for i in range(h): for j in range(w): if calc_diff(logo[i][j]) < threshold: #若果logo[i][j]為背景,將其顏色設(shè)為白色,且完全透明 logo[i][j][0] = 255 logo[i][j][1] = 255 logo[i][j][2] = 255 logo[i][j][3] = 0 cv.imwrite("./logo_rmbg.png", logo) if __name__ == '__main__': remove_bg()
使用方法
修改第5行的bg_color為圖片背景的bgr值,以及第6行的threshold(threshold越大,覆蓋的像素越多)。
效果:
emmm,事實(shí)證明背景附近的顏色不是嚴(yán)格的背景色,后來(lái)將字填充后好多了。
以上這篇opencv之顏色過(guò)濾只留下圖片中的紅色區(qū)域操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
tkinter禁用(只讀)下拉列表Combobox問(wèn)題
這篇文章主要介紹了tkinter禁用(只讀)下拉列表Combobox問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python高階函數(shù)map()?簡(jiǎn)介和使用詳解
map()?函數(shù)是Python中的內(nèi)置函數(shù),這個(gè)函數(shù)又叫做映射函數(shù),其實(shí)里面具有一個(gè)迭代器的功能,會(huì)依次遍歷可迭代對(duì)象進(jìn)行相關(guān)的操作,這篇文章主要介紹了Python高階函數(shù)map()?簡(jiǎn)介和使用詳解,需要的朋友可以參考下2023-03-03Python爬蟲(chóng)信息輸入及頁(yè)面的切換方法
今天小編就為大家分享一篇Python爬蟲(chóng)信息輸入及頁(yè)面的切換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05淺談Pandas:Series和DataFrame間的算術(shù)元素
今天小編就為大家分享一篇淺談Pandas:Series和DataFrame間的算術(shù)元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能,涉及Python基于difflib模塊的文件比較及smtplib模塊的郵件發(fā)送相關(guān)操作技巧,需要的朋友可以參考下2019-02-02matplotlib?雙y軸繪制及合并圖例的實(shí)現(xiàn)代碼
這篇文章主要介紹了matplotlib?雙y軸繪制及合并圖例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10