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