imread()
;cvtColor()
;canny()
;膨胀操作, 填充边缘缝隙
dilate()
;
Holes填充
自定义Holes填充函数
;
#include
#include
#include
#include
#include
#define zoom 3 // 缩放因子, 将大图像缩小 n 倍显示
using namespace cv;
using namespace std;
// 填充holes
void fillHole(const Mat srcBw, Mat &dstBw);
int main()
{
// 【1】读入图像
Mat srcImage;
srcImage = imread("imagename");
if (!srcImage.data) { //处理错误
cout << "读取图片错误!" << endl;
system("pause");
return false;
}
//【2】将图片转为灰度图
cvtColor(srcImage, srcImage, COLOR_BGR2GRAY);
Mat temp;
temp = srcImage;
resize(temp, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
imshow("[灰度图]", temp);
// 【3】canny算子边缘检测
Mat edge;
blur(srcImage, edge, Size(3, 3));//3x3内核降噪
Canny(srcImage, edge, 150, 100, 3);
temp = edge;
resize(edge, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
imshow("[canny算子边缘检测]", temp);
//【4】膨胀操作, 填充边缘缝隙
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
for (int i = 0;i < 3;i++) {
dilate(edge, edge, element);
}
temp = edge;
resize(edge, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
imshow("[膨胀操作效果图]", temp);
// 【5】Holes填充
for (int i = 0;i < 10;i++) // 填充10次
{
fillHole(edge, edge);
}
temp = edge;
resize(edge, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
imshow("[Holes填充图]", temp);
waitKey(0); // 等待按键结束
return 0;
}
// 填充Holes
void fillHole(const Mat srcBw, Mat &dstBw)
{
Size m_Size = srcBw.size();
Mat Temp = Mat::zeros(m_Size.height + 2, m_Size.width + 2, srcBw.type());//延展图像
srcBw.copyTo(Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)));
floodFill(Temp, Point(0, 0), Scalar(255));
Mat cutImg;//裁剪延展的图像
Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)).copyTo(cutImg);
dstBw = srcBw | (~cutImg);
}
编译环境: opencv 3.2.0 + VS2015
【原图 Dr. John H. Watson】
【处理结果2】
http://movie.mtime.com/126627/posters_and_images/productionphoto/hot.html
(全文完)