1. 程式人生 > >【Python——opencv篇】 bitwise_and、bitwise_not等影象基本運算及掩膜

【Python——opencv篇】 bitwise_and、bitwise_not等影象基本運算及掩膜

1.影象基本運算

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

void add(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), int dtype=-1);//dst = src1 + src2
void subtract(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), int dtype=-1);//dst = src1 - src2
void multiply(InputArray src1, InputArray src2,OutputArray dst, double scale=1, int dtype=-1);//dst = scale*src1*src2
void divide(InputArray src1, InputArray src2, OutputArray dst,double scale=1, int dtype=-1);//dst = scale*src1/src2
void divide(double scale, InputArray src2,OutputArray dst, int dtype=-1);//dst = scale/src2
void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);//dst = alpha*src1 + src2
void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype=-1);//dst = alpha*src1 + beta*src2 + gamma
void sqrt(InputArray src, OutputArray dst);//計算每個矩陣元素的平方根
void pow(InputArray src, double power, OutputArray dst);//src的power次冪
void exp(InputArray src, OutputArray dst);//dst = e**src(**表示指數的意思)
void log(InputArray src, OutputArray dst);//dst = log(abs(src))

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

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

void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src2
void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 | src2
void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 ^ src2
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.掩膜應用例項

以鬱金香圖片為例,原圖大小為1024×768,先壓縮一下,利用opencv的inRange()函式,製作掩模,再用bitwise_and()函式,提取感興趣區域:

3.1程式碼

import cv2 as cv
import numpy as np

# set blue thresh
lower_yellow=np.array([11,43,46])
upper_yellow=np.array([25,255,255])

frame=cv.imread("tulips.jpg") #讀取影象
cv.imshow("who",frame)

#compress
cp = cv.resize(frame, (300,300), interpolation=cv.INTER_AREA)
cv.imwrite("tulips_1.jpg",cp)

# change to hsv model
hsv = cv.cvtColor(cp, cv.COLOR_BGR2HSV)
 
# get mask
mask = cv.inRange(hsv, lower_yellow, upper_yellow)
cv.imshow('Mask', mask)

# detect blue
res = cv.bitwise_and(cp, cp, mask=mask)
cv.imshow('Result', res)
 
cv.waitKey(0)
cv.destroyAllWindows()

3.2實驗效果 

              壓縮(300×300)                                                              掩模(300×300)

                       
                              

                                                        處理後(300×300)

                                          

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

參考博文:https://blog.csdn.net/u011028345/article/details/77278467