文档库 最新最全的文档下载
当前位置:文档库 › 数字图像处理大作业报告

数字图像处理大作业报告

数字图像处理大作业报告
数字图像处理大作业报告

数字图像处理

实验报告

实验选题:选题二

组员:

学号:

班级:

指导老师:

实验日期:2019年5月22日

一、实验目的及原理

1.识别出芯片的引脚

2.熟悉并掌握opencv的某些函数的功能和使用方法

原理:通过滤波、形态学操作得到二值图,再在二值图中设置条件识别引脚部分。

二、实现方案

对图片滤波、调节阈值做边缘检测过滤掉一部分图片中干扰元素;然后通过膨胀、腐蚀操作来减少引脚的空心部分;再通过findContours()函数找到引脚的边缘并得到轮廓的点集,设置特定的长宽比和矩形面积识别引脚部分。

三、实验结果

四、源码

#include

#include

#include"opencv2/highgui/highgui.hpp"

#include"opencv2/imgproc/imgproc.hpp"

using namespace std;

using namespace cv;

int main(int argv, char **argc)

{

//载入图片

Mat srtImag = imread("2.jpg");

Mat G_blur = srtImag.clone();

//降噪

blur(G_blur, G_blur, Size(5, 5));

//imshow("降噪", G_blur);

//Canny边缘检测

Mat Canny_Imag = G_blur;

Canny_Imag = Canny_Imag > 176;

Canny(G_blur, Canny_Imag, 300, 50, 3);

//imshow("边缘检测", Canny_Imag);

//膨胀

Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));

dilate(Canny_Imag, Canny_Imag, element);

//imshow("膨胀", Canny_Imag);

//腐蚀

Mat element_1 = getStructuringElement(MORPH_RECT, Size(11, 11));

erode(Canny_Imag, Canny_Imag, element_1);

//imshow("腐蚀", Canny_Imag);

//查找轮廓

vector>contours;

vectorhierarchy;

findContours(Canny_Imag, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

vector> contour_s(contours.size());//该数组共有contours.size()个轮廓的点集

vector Rec_s(contours.size());//逼近多边形的点集数组

//获得每个轮廓点集的逼近多边形的点集

for (size_t i = 0; i < contours.size(); i++) {

approxPolyDP(Mat(contours[i]), contour_s[i], 3,

false);//contour_s存储逼近多边形的点集

Rec_s[i]= boundingRect(contour_s[i]); //Rec_s存储最小包围矩形的点集

}

//筛选合适长宽比的矩形并将其画出来

Mat result_Imag = srtImag.clone();

for (size_t j = 0; j < contours.size(); j++) {

double as_ra;//长宽比

as_ra = Rec_s[j].height / Rec_s[j].width;

if (as_ra > 3.3 && as_ra < 9.3 && Rec_s[j].area() > 20) { rectangle(result_Imag, Rec_s[j], Scalar(0, 255, 255), 2, 7);

}

}

imshow("result", result_Imag);

waitKey(0);

return 0;

}

五、总结

经过这次实验,我熟悉了对blur()、Canny()、dilate()、erode()、findContours()、approxPolyDP()等函数的使用,了解了Rect类的构成等。实验主要是调用函数解决问题,所以总体来说,选题二比较简单。

相关文档