数字图像处理大作业报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理
实验报告
实验选题:选题二
组员:
学号:
班级:
指导老师:
实验日期: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
vector
findContours(Canny_Imag, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
vector
vector
//获得每个轮廓点集的逼近多边形的点集
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类的构成等。实验主要是调用函数解决问题,所以总体来说,选题二比较简单。