前言
今天看了篇微信公众号,是使用python opencv 检测出低对比度图像中所有的圆,感觉挺有意思的,这里用C++实现出来,对原始的参数做了改动(发现原始参数检测出的圆有漏检的情况,主要是由于形态学开闭操作结果和预期结果不一致导致的)。
1. 低对比度图像中圆的检测步骤
- 读取彩色图像;
- 转换灰度图像;
- 模糊图像(ksize=50);
- 计算灰度图像与模糊图像的差值图像;
- 对差值图像进行二值化操作(阈值为15);
- 对二值化图像进行闭操作,连接不连续区域;(核大小为11x11)
- 对闭操作后的图像进行形态学开运算,分割出不同圆;(核大小为9x9)
- 查找轮廓;
- 过滤轮廓并绘制圆,主要针对图像上的水印;
2. C++ OpenCV实现
#include <iostream>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\imgproc.hpp>
#include <opencv2\core.hpp>
#include <opencv2\highgui.hpp>
#include <vector>
int main()
{
using namespace std;
using namespace cv;
string strImgFile = "C:\\Temp\\common\\Workspace\\Opencv\\images\\low_contrast_circle.jpg";
Mat src = imread(strImgFile);
CV_Assert(src.empty() == false);
imshow(&