#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
/*
形態學操作:提取水平線或垂線
1、輸入彩色圖像;
2、轉化爲灰度圖像
3、轉化爲二值圖像
4、定義結構元素
5、形態學操作 開操作(先腐蝕,後膨脹)可去掉小的對象
*/
int main()
{
//1、輸入彩色圖像;
Mat srcImg = imread("C:/Users/admin/Desktop/test222.png");
if (!srcImg.data)
{
printf("沒有找到!!!");
return -1;
}
//2、轉化爲灰度圖像
Mat grayImg;
cvtColor(srcImg, grayImg, CV_BGR2GRAY);
namedWindow("grayImg windows", CV_WINDOW_AUTOSIZE);
imshow("grayImg windows", grayImg);
//3、轉化爲二值圖像 灰度圖像 才能轉化二值圖像
Mat binImg;
adaptiveThreshold(~grayImg, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
namedWindow("binImg windows", CV_WINDOW_AUTOSIZE);
imshow("binImg windows", binImg);
//4、定義結構元素
Mat hline = getStructuringElement(MORPH_RECT, Size(srcImg.cols/16, 1), Point(-1, -1));//水平結構
Mat vline = getStructuringElement(MORPH_RECT, Size(1, srcImg.rows/16), Point(-1, -1));//垂直結構
Mat rectStruct = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1, -1));
//5、形態學操作 開操作(先腐蝕,後膨脹)可去掉小的對象
Mat outImg;
//morphologyEx(binImg, outImg, MORPH_OPEN, rectStruct);//開操作(先腐蝕後膨脹)
Mat tmpImg;
erode(binImg, tmpImg, rectStruct, Point(-1, -1));//腐蝕
dilate(tmpImg, outImg, rectStruct, Point(-1, -1));
bitwise_not(outImg, outImg);//反色
//blur(outImg, outImg, Size(3, 3), Point(-1, -1));//均值濾波
namedWindow("outImg windows", CV_WINDOW_AUTOSIZE);
imshow("outImg windows", outImg);
namedWindow("srcImg windows",CV_WINDOW_AUTOSIZE);
imshow("srcImg windows",srcImg);
waitKey(0);
return 0;
}
2、高斯金字塔
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//圖像金字塔
//1、輸入彩色圖像;
Mat srcImg = imread("C:/Users/admin/Desktop/1.JPG");
if (!srcImg.data)
{
printf("沒有找到!!!");
return -1;
}
//上採樣
Mat s_upImg;
pyrUp(srcImg, s_upImg, Size(srcImg.cols * 2, srcImg.rows * 2));
imshow("s_upImg window", s_upImg);
//降採樣
Mat s_downImg;
pyrDown(srcImg, s_downImg, Size(srcImg.cols / 2, srcImg.rows / 2));
imshow("s_downImg window", s_downImg);
//高斯不同
Mat gray_srcImg, g1, g2,dog_img;
//轉化爲灰度圖像
cvtColor(srcImg, gray_srcImg, CV_BGR2GRAY);
//進行高斯模糊 高斯不同
GaussianBlur(gray_srcImg, g1, Size(5, 5), 0, 0);
GaussianBlur(g1, g2, Size(5, 5), 0);
subtract(g1, g2, dog_img,Mat());
normalize(dog_img, dog_img, 255, 0, NORM_MINMAX);//歸一化顯示
imshow("dog_img window", dog_img);
namedWindow("srcImg windows", CV_WINDOW_AUTOSIZE);
imshow("srcImg windows", srcImg);
waitKey(0);
return 0;
}
3、基本閾值操作
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat srcImg, gray_Img, dstImg;
char OUT_PUT_WINDOW[] = "out_put window";
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int max_value = 4;
void CallBack_Dome(int, void*);
int main()
{
srcImg = imread("C:/Users/admin/Desktop/1.JPG");
if (!srcImg.data)
{
printf("沒有找到!!!");
return -1;
}
namedWindow(OUT_PUT_WINDOW, CV_WINDOW_AUTOSIZE);
createTrackbar("Threshold value:", OUT_PUT_WINDOW, &threshold_value, threshold_max, CallBack_Dome);
createTrackbar("type value:", OUT_PUT_WINDOW, &type_value, max_value, CallBack_Dome);
CallBack_Dome(0,0);
namedWindow("srcImg windows", CV_WINDOW_AUTOSIZE);
imshow("srcImg windows", srcImg);
waitKey(0);
return 0;
}
void CallBack_Dome(int, void*)
{
cvtColor(srcImg, gray_Img, CV_BGR2GRAY);
//threshold(gray_Img, dstImg, threshold_value, threshold_max, type_value);//THRESH_BINARY 二值化 THRESH_BINARY_INV 反向二值化
threshold(gray_Img, dstImg, 0, 255, THRESH_TRUNC|type_value);//自動計算閾值THRESH_OTSU
imshow(OUT_PUT_WINDOW, dstImg);
}