1. 程式人生 > >OpenCV之bitwise_and、bitwise_not等影象基本運算及掩膜

OpenCV之bitwise_and、bitwise_not等影象基本運算及掩膜

轉:https://blog.csdn.net/u011028345/article/details/77278467

1.影象基本運算


影象的基本運算有很多種,比如兩幅影象可以相加、相減、相乘、相除、位運算、平方根、對數、絕對值等;影象也可以放大、縮小、旋轉,還可以擷取其中的一部分作為ROI(感興趣區域)進行操作,各個顏色通道還可以分別提取及對各個顏色通道進行各種運算操作。總之,對於影象可以進行的基本運算非常的多,只是挑了些常用的操作詳解。

 
  1. void add(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), int dtype=-1);//dst = src1 + src2

  2. void subtract(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), int dtype=-1);//dst = src1 - src2

  3. void multiply(InputArray src1, InputArray src2,OutputArray dst, double scale=1, int dtype=-1);//dst = scale*src1*src2

  4. void divide(InputArray src1, InputArray src2, OutputArray dst,double scale=1, int dtype=-1);//dst = scale*src1/src2

  5. void divide(double scale, InputArray src2,OutputArray dst, int dtype=-1);//dst = scale/src2

  6. void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);//dst = alpha*src1 + src2

  7. void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype=-1);//dst = alpha*src1 + beta*src2 + gamma

  8. void sqrt(InputArray src, OutputArray dst);//計算每個矩陣元素的平方根

  9. void pow(InputArray src, double power, OutputArray dst);//src的power次冪

  10. void exp(InputArray src, OutputArray dst);//dst = e**src(**表示指數的意思)

  11. void log(InputArray src, OutputArray dst);//dst = log(abs(src))

 

上述的基本操作中都屬於將基礎數學運算應用於影象畫素的處理中,下面將著重介紹

 

 
  1. bitwise_and、bitwise_or、bitwise_xor、bitwise_not這四個按位操作函式。

  2. void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src2

  3. void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 | src2

  4. void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 ^ src2

  5. void bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray());//dst = ~src

bitwise_and是對二進位制資料進行“與”操作,即對影象(灰度影象或彩色影象均可)每個畫素值進行二進位制“與”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是對二進位制資料進行“或”操作,即對影象(灰度影象或彩色影象均可)每個畫素值進行二進位制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是對二進位制資料進行“異或”操作,即對影象(灰度影象或彩色影象均可)每個畫素值進行二進位制“異或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是對二進位制資料進行“非”操作,即對影象(灰度影象或彩色影象均可)每個畫素值進行二進位制“非”操作,~1=0,~0=1
 

2.掩膜(mask)

 

2.1在有些影象處理的函式中有的引數裡面會有mask引數,即此函式支援掩膜操作,首先何為掩膜以及有什麼用,如下:


數字影象處理中的掩膜的概念是借鑑於PCB製版的過程,在半導體制造中,許多晶片工藝步驟採用光刻技術,用於這些步驟的圖形“底片”稱為掩膜(也稱作“掩模”),其作用是:在矽片上選定的區域中對一個不透明的圖形模板遮蓋,繼而下面的腐蝕或擴散將隻影響選定的區域以外的區域。
影象掩膜與其類似,用選定的影象、圖形或物體,對處理的影象(全部或區域性)進行遮擋,來控制影象處理的區域或處理過程。 
數字影象處理中,掩模為二維矩陣陣列,有時也用多值影象,影象掩模主要用於:
①提取感興趣區,用預先製作的感興趣區掩模與待處理影象相乘,得到感興趣區影象,感興趣區內影象值保持不變,而區外影象值都為0。 
②遮蔽作用,用掩模對影象上某些區域作遮蔽,使其不參加處理或不參加處理引數的計算,或僅對遮蔽區作處理或統計。 
③結構特徵提取,用相似性變數或影象匹配方法檢測和提取影象中與掩模相似的結構特徵。 
④特殊形狀影象的製作。

2.2 在所有影象基本運算的操作函式中,凡是帶有掩膜(mask)的處理函式,其掩膜都參與運算(輸入影象運算完之後再與掩膜影象或矩陣運算)。


3.掩膜應用例項


下為臉部面具圖,背景為白色,利用按位操作及掩膜技術清晰摳出面具輪廓。

 
  1. // 轉換面具為灰度影象

  2. cvtColor(faceMaskSmall, grayMaskSmall, CV_BGR2GRAY);

  3. // 隔離影象上畫素的邊緣,僅與面具有關(即面具的白色區域剔除),下面函式將大於230畫素的值置為0,小於的置為255

  4. threshold(grayMaskSmall, grayMaskSmallThresh, 230, 255, CV_THRESH_BINARY_INV);

  5. // 通過反轉上面的影象建立掩碼(因為不希望背景影響疊加)

  6. bitwise_not(grayMaskSmallThresh, grayMaskSmallThreshInv);

  7. //使用位“與”運算來提取面具精確的邊界

  8. bitwise_and(faceMaskSmall, faceMaskSmall, maskedFace, grayMaskSmallThresh);

  9. // 使用位“與”運算來疊加面具

  10. bitwise_and(frameROI, frameROI, maskedFrame, grayMaskSmallThreshInv);




利用掩膜(mask)進行“與”操作,即掩膜影象白色區域是對需要處理影象畫素的保留,黑色區域是對需要處理影象畫素的剔除,其餘按位操作原理類似只是效果不同而已。