opencv 人像检测 + Holes填充

人像检测 + Holes填充步骤

  1. 读入图像
    imread();
  2. 将图像转为灰度图
    cvtColor();
  3. canny算子边缘检测
    canny();
  4. 膨胀操作, 填充边缘缝隙
    dilate();

  5. 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

Test-1

【原图 Sherlock Holmes】
opencv 人像检测 + Holes填充_第1张图片
【处理结果1】
opencv 人像检测 + Holes填充_第2张图片

Test-2

【原图 Dr. John H. Watson】
opencv 人像检测 + Holes填充_第3张图片
【处理结果2】
opencv 人像检测 + Holes填充_第4张图片

测试集

http://movie.mtime.com/126627/posters_and_images/productionphoto/hot.html

(全文完)

你可能感兴趣的:(圖形圖像)