一、实验内容
用计算机视觉的方法数米粒。
二、实验目的及意义
计算机视觉的应用非常广泛,本实验就是让同学们对计算机视觉技术的应用有一个简单的了解。
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); }