學習OpenCV 第五章課後練習題5
載入一張風景照片,然後風景不動,在中心位置放一個咖啡杯,再拍攝一張,載入電腦過程中轉換爲8爲灰度圖像。
a:取其差的絕對值並顯示結果=>帶有噪聲的咖啡杯掩碼
b:結果進行二值化閾值操作,超過閾值的設置爲255
c:進行CV_MOP_OPEN操作,進一步清除噪聲
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <stdio.h>
#include <cstdlib>
using namespace std;
using namespace cv;
int main(int argc, const char * argv[]) {
/*1.載入圖像*/
const char filename1[] = "/Users/linwang/DownLoads/Pic3.jpg";
const char filename2[] = "/Users/linwang/DownLoads/Pic4.jpg";
IplImage * Img1 = cvLoadImage(filename1,CV_LOAD_IMAGE_GRAYSCALE);
IplImage * Img2 = cvLoadImage(filename2,CV_LOAD_IMAGE_GRAYSCALE);
/*2.縮放圖像*/
double fScale = 0.1; //縮放倍數
CvSize czSize; //目標圖像尺寸
czSize.width = Img1->width * fScale;
czSize.height = Img1->height * fScale;
IplImage * New_Img1 = cvCreateImage(czSize, Img1->depth , Img1->nChannels);
cvResize(Img1, New_Img1);
IplImage * New_Img2 = cvCreateImage(czSize, Img2->depth , Img2->nChannels);
cvResize(Img2, New_Img2);
cout<<New_Img1->width<<" -> "<<New_Img1->height<<endl;
cout<<New_Img2->width<<" -> "<<New_Img2->height<<endl;
cvNamedWindow("Pic1");
cvNamedWindow("Pic2");
cvShowImage("Pic1", New_Img1);
cvShowImage("Pic2", New_Img2);
/*3.計算img1 和 img2差值的絕對值*/
IplImage * diff12 = cvCloneImage(New_Img1);
cvSetZero(diff12);
cvAbsDiff(New_Img1, New_Img2, diff12);
cvNamedWindow("ABSDIFF");
cvShowImage("ABSDIFF", diff12);
/*4.將圖像二值閾值化*/
IplImage * dst = cvCloneImage(diff12);
cvSetZero(dst);
cvThreshold(diff12, dst, 50, 255, CV_THRESH_TRUNC);
cvShowImage("Binary", dst);
/*5.將圖像進行CV_MOP_OPEN操作*/
IplImage * Mop_Open = cvCloneImage(dst);
cvSetZero(Mop_Open);
cvMorphologyEx(dst, Mop_Open, NULL,NULL, CV_MOP_OPEN, 1);
cvShowImage("MOP_OPEN", Mop_Open);
cvWaitKey(0);
return 1;
}