opencv提取水平垂直線、高斯金字塔、基本閾值操作(5)

 #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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章