一、检测背景
halcon中有例程针对微小不明显缺陷的检测

思路:
1.将图片转为频域图;
2.构造高斯滤波器,设计带宽滤波,去除高频噪点和低频模糊
3.针对滤波后的时域图进行局部增强
4.挑选合适的阈值对缺陷进行提取,辅助一些形态学操作
二、代码实现(demo)
cpp
enum class FrequencyFilterType
{
IDEAL_LOW_PASS = 1, // 1-理想低通
IDEAL_HIGH_PASS = 2, // 2-理想高通
GAUSSIAN_LOW_PASS = 3, // 3-高斯低通
GAUSSIAN_HIGH_PASS = 4, // 4-高斯高通
BUTTERWORTH_LOW_PASS = 5,// 5-巴特沃斯低通
BUTTERWORTH_HIGH_PASS = 6,// 6-巴特沃斯高通
BAND_PASS = 7, // 7-带通(允许低截止和高截止内的频率通过)
BAND_STOP = 8 //8-带阻
};
void main()
{
try {
std::vector<cv::String> strs;
glob("youPath\\plastics\\plastics_*.png", strs);
for (String str : strs)
{
Mat src = imread(str, -1);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(3, 3), 1);
Mat filter, filter2, filter3;
fft_Filter(gray, filter, FrequencyFilterType::BAND_PASS, 6, 20, 0);
Mat result = gray_range_rect(filter, 9);
/*cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(13, 13));
cv::morphologyEx(result, result, cv::MORPH_CLOSE, kernel);*/
double Min, Max;
cv::minMaxLoc(result, &Min, &Max);
double thresh = Max * 0.9;
cv::Mat binary;
cv::threshold(result, binary, thresh, 255, cv::THRESH_BINARY);
Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(13, 13));
cv::Mat closing;
cv::morphologyEx(binary, closing, cv::MORPH_CLOSE, kernel);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(closing, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
for (int cnt = 0; cnt < contours.size(); cnt++) {
Rect rect = boundingRect(contours[cnt]);
if (rect.area() >= 4 ) {
Moments moment = moments(contours[cnt]);
Point center;
center.x = moment.m10 / moment.m00;
center.y = moment.m01 / moment.m00;
circle(src, center, 20, Scalar(0, 0, 255), 3);
//drawContours(src, contours, cnt, Scalar(0, 0, 255));
}
}
}
}
catch (std::exception& ex) {
std::cout << ex.what();
}
}
检测效果如下:



三、代码分析
1.opencv实现多种频域滤波操作
2.将halcon的gray_range_rect使用opencv的形态学操作替换
3.存在些许过检
获取源码请私信