使用Visual Studio+OpenCV进行的Susan算子边缘检测及数米粒图像处理实验

一、实验内容

        用计算机视觉的方法数米粒。

二、实验目的及意义

        计算机视觉的应用非常广泛,本实验就是让同学们对计算机视觉技术的应用有一个简单的了解。

        1、了解计算机视觉的实验环境。本实验选用的是 VS+OpenCV。

        2、掌握 OpenCV 在 VS 中的环境配置方法。

        3、学会使用 OpenCV 在 VS 中读入图像并显示图像的方法。

        4、能够对读取的彩色图像进行灰度化处理,并且能够获取灰度图像中每一个像素点的值。

        5、了解图像边缘检测的目的及意义,加深对边缘检测的感性认识。

        6、掌握简单的图像滤波方法。

        7、掌握 SUNSAN 边缘检测方法。

        8、了解图像分割的目的及意义,加深对图像的感性认识。

        9、掌握简单的图像分割方法。

        10、了解目标形状检测的目的和意义,加深对形状检测的感性认识。

        11、掌握基于几何特征的形状检测方法。

三、实验环境

         Visual Studio + OpenCV。

四、实验原理

         1、安装 VS 和 OpenCV 软件;

        2、配置 OpenCV:

            (1)配置环境变量。

            (2)创建 VS 一个控制项目工程,对工程目录进行配置。

        3、主要图像处理函数:用imread读入一幅图像,用imshow显示图像。

        4、将一幅彩色图转换成转灰度图。

        5、对米粒图像进行中值滤波,使用medianBlur函数。

        6、对滤波后的米粒图像用 SUNSAN 算子进行边缘检测。

        7、画出米粒图像的灰度直方图;

        8、根据该直方图,确定米粒图像分割的阈值,将米粒图像转变程只有米粒和背景的二值图像。

        9、计算每一粒米的区域重心,面积,周长等属性。

        10、通过最大和最小距离计算各种几何形状的面积。

        11、输出米粒图像中米粒的个数;最大的米粒和最小的米粒个数。

五、实验结果


六、实验代码

(只展示主函数代码,若获取全部代码及资源文件请前往https://download.csdn.net/download/asdf1712/10401389  下载)

int main() {
	uint i;
	CvMemStorage* stor = cvCreateMemStorage(0);
	vector<vector<Point> > contours;
	vector<Vec4i> hierarchy;
	int thresh1;
	double thresh2;
	Mat Img,binImg,subImg1, subImg2,ground, grayGround,otsuImg,maxrice;
	Mat grayImg,medImg,susanImg;
	//打开图像
	Img = imread("..\\rice.jpg",1);

	ground = imread("..\\米粒图二值图.jpg", 1);
	imshow("groundtruth",ground);
	//转换为灰度图像
	cvtColor(Img, grayImg, CV_BGR2GRAY);
	cvtColor(ground, grayGround, CV_BGR2GRAY);
	
	//中值滤波
	medianBlur(grayImg, medImg, 7);
	imshow("median filter", medImg);
	Mat histogram = getHistogramImage(medImg);
	imshow("Histogram", histogram);

	thresh1 = SelectThreshold(medImg);

	threshold(medImg,binImg,thresh1, 255, CV_THRESH_BINARY);
	namedWindow("二值化图像");
	imshow("二值化图像", binImg);

	susanImg = SusanFun(medImg);
	imshow("Susan Filter",susanImg);
	imwrite("Susan轮廓图.jpg", susanImg);

	findContours(binImg, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
	cout << "米粒的个数为: " << contours.size() << endl;

	//找最大米粒
	// 面积
	vector<float> area(contours.size());
	for (i = 0; i< contours.size(); i++) {
		area[i] = contourArea(contours[i]);
	}
	float area_max = 0;
	for (i = 0; i< area.size(); i++) {
		if (area[i] >area_max)
			area_max = area[i];
	}
	for (i = 0; i< area.size(); i++) {
		if (area[i] ==area_max)
			break;
	}
	maxrice = susanImg;
	drawContours(maxrice, contours,i, Scalar(255), CV_FILLED);
	imshow("找最大米粒", maxrice);

	//与groundtruth做减法
	absdiff(binImg, grayGround, subImg1);//I=|I1-I2|;
	imshow("经验阈值分割法与groundtruth做减法", subImg1);

	thresh2= threshold(medImg, otsuImg, 0, 255, CV_THRESH_OTSU);
	imshow("大津法二值化处理", otsuImg);
	absdiff(otsuImg, grayGround, subImg2);//I=|I1-I2|;
	imshow("大津法与groundtruth做减法", subImg2);
	
	waitKey(0);
}

猜你喜欢

转载自blog.csdn.net/ASDF1712/article/details/80245851