邏輯運算圖形合成與反白
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main()
{
IplImage *Image1,*Image2,*Image3,*Image4,*Image5;
Image1=cvLoadImage("Block.jpg",1);
Image2=cvLoadImage("bower.jpg",1);
Image3=cvCreateImage(cvSize(384,512),IPL_DEPTH_8U,3);
Image4=cvLoadImage("footpath.jpg",1);
Image5=cvCloneImage(Image3);
CvRect Rect1=cvRect(140,305,115,165);
cvSetImageROI(Image4,Rect1);
cvSet(Image4,cvScalar(0,0,0));
cvResetImageROI(Image4);
Rect1=cvRect(0,0,Image2->width,Image2->height);
cvSetImageROI(Image4,Rect1);
cvAnd(Image1,Image2,Image3);
cvXor(Image3,Image4,Image5);
cvNot(Image2,Image2);
cvNamedWindow("Not bower",1);
cvShowImage("Not bower",Image2);
cvNamedWindow("Compose pic",1);
cvShowImage("Compose pic",Image5);
cvWaitKey(0);
}
原始圖片:



(Block.jpg)(bower.jpg)(footpath.jpg)
執行結果:
上面的程式用到了之前的bower.jpg與footpath.jpg的圖片,而對footpath.jpg製作ROI,在座標(140,305)的地方設立寬115高165的方框,並把那部分設為黑色,再重置ROI,設立感興趣的區域為寬384高512的大小,因為邏輯運算的函式兩張圖片必須要同樣通道數,同樣大小,再對bower.jpg跟Block.jpg做AND運算,運算出來的結果再跟ROI後的footpath.jpg做XOR,而cvNot()的部份,則是將bower.jpg的原圖反白.而大部分的邏輯運算都有支援圖形遮罩的功能.
(1)圖形做AND運算



(2)圖形做XOR運算



(3)圖形做NOT運算


再來是CvMat邏輯運算的實作
CvMat的邏輯運算
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
uchar MatrixData1[]={255,255,255,0};
uchar MatrixData2[]={192,168,0,3};
uchar MatrixData3[]={7,233,0,255};
uchar MatrixData4[4];
void PrintMatrix(CvMat *Matrix);
int main()
{
CvMat Matrix1=cvMat(1,4,CV_8UC1,MatrixData1);
CvMat Matrix2=cvMat(1,4,CV_8UC1,MatrixData2);
CvMat Matrix3=cvMat(1,4,CV_8UC1,MatrixData3);
CvMat Matrix4=cvMat(1,4,CV_8UC1,MatrixData4);
printf("\nMatrix Not:\n");
cvNot(
&
Matrix3,&
Matrix4);PrintMatrix(
&
Matrix4);printf("\nMatrix And:\n");
cvAnd(
&
Matrix1,&
Matrix2,&
Matrix4);PrintMatrix(
&
Matrix4);printf("\nMatrix Or:\n");
cvOr(
&
Matrix2,&
Matrix3,&
Matrix4);PrintMatrix(
&
Matrix4);printf("\nMatrix Xor:\n ");
cvXor(
&
Matrix2,&
Matrix3,&
Matrix4);PrintMatrix(
&
Matrix4);printf("\nMatrix AndS:\n");
cvAndS(
&
Matrix3,cvRealScalar(38),&
Matrix4);PrintMatrix(
&
Matrix4);printf("\nMatrix OrS:\n");
cvOrS(
&
Matrix3,cvRealScalar(207),&
Matrix4);PrintMatrix(
&
Matrix4);printf("\nMatrix XorS:\n");
cvXorS(
&
Matrix3,cvRealScalar(128),&
Matrix4);PrintMatrix(
&
Matrix4);system("pause");
}
void PrintMatrix(CvMat *Matrix)
{
for(int j=0;j<4;j++)
{
printf("%.f ",cvGet2D(Matrix,0,j).val[0]);
}
printf("\n");
}
執行結果:
這邊的AND運算就是子網路遮罩(Subnet Mask)的原理,cvAndS(),cvSubS(),cvOrS(),cvXorS()的S代表著是對全1純量的邏輯運算,且支援多通道的邏輯運算,以下分類說明
1.cvNot(
&
Matrix3,&
Matrix4)2.cvAnd(
&
Matrix1,&
Matrix2,&
Matrix4)3.cvOr(
&
Matrix2,&
Matrix3,&
Matrix4)4.cvXor(
&
Matrix2,&
Matrix3,&
Matrix4)5.cvAndS(
&
Matrix3,cvRealScalar(38),&
Matrix4)6.cvOrS(
&
Matrix3,cvRealScalar(207),&
Matrix4)7.cvXorS(
&
Matrix3,cvRealScalar(128),&
Matrix4)cvNot()
對所有位元數值的0變1,1變0,簡單來說,就是將它反白.但是輸入跟輸出必須要同大小,同通道數據.
cvNot(目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構)
cvAnd()
對兩張圖形做AND邏輯運算,具有兩個輸入一個輸出,且有遮罩(Mask)的功能.輸入跟輸出必須要同大小,同通道數據.
cvAnd(目標IplImage資料結構或CvMat結構,目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)
cvOr()
對兩張圖做OR邏輯運算,具有兩個輸入一個輸出,且有遮罩的功能.輸入跟輸出必須要同大小,同通道數據.
cvAnd(目標IplImage資料結構或CvMat結構,目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)
cvXor()
對兩張圖做Xor邏輯運算,具有兩個輸入一個輸出,且有遮罩的功能.輸入跟輸出必須要同大小,同通道數據.
cvXor(目標IplImage資料結構或CvMat結構,目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)
cvAndS()
對目標圖與全1純量積矩陣做AND邏輯運算,第一個引數為目標矩陣,第二個引數為CvScalar資料結構的純量值,可支援多通道,且具有遮罩的功能.
cvAndS(目標IplImage資料結構或CvMat結構,CvScalar純量結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)
cvOrS()
對目標圖與全1純量積矩陣做Or邏輯運算,第一個引數為目標矩陣,第二個引數為CvScalar資料結構的純量值,可支援多通道,且具有遮罩的功能.
cvOrS(目標IplImage資料結構或CvMat結構,CvScalar純量結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)
cvXorS()
對目標圖與全1純量積矩陣做XOr邏輯運算,第一個引數為目標矩陣,第二個引數為CvScalar資料結構的純量值,可支援多通道,且具有遮罩的功能.
cvXorS(目標IplImage資料結構或CvMat結構,CvScalar純量結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)
2 意見:
做的相当好,支持!!!!
為什麼我執行後沒有執行畫面?
張貼留言