1 找出轮廓然后在处理

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char** argv)
{
    //Mat im = imread("D:\\software\\opencv2413\\opencv\\sources\\samples\\cpp\\baboon.jpg", 0);
    Mat im = imread("pred_5.png", 0);
    Mat cont = ~im;
    Mat original = Mat::zeros(im.rows, im.cols, CV_8UC3);
    Mat smoothed = Mat(im.rows, im.cols, CV_8UC3, Scalar(255, 255, 255));

    // contour smoothing parameters for gaussian filter
    int filterRadius = 5;
    int filterSize = 2 * filterRadius + 1;
    double sigma = 10;

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    // find contours and store all contour points
    findContours(cont, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, Point(0, 0));
    for (size_t j = 0; j < contours.size(); j++)
    {
        // extract x and y coordinates of points. we'll consider these as 1-D signals
        // add circular padding to 1-D signals
        size_t len = contours[j].size() + 2 * filterRadius;
        size_t idx = (contours[j].size() - filterRadius);
        vector<float> x, y;
        for (size_t i = 0; i < len; i++)
        {
            x.push_back(contours[j][(idx + i) % contours[j].size()].x);
            y.push_back(contours[j][(idx + i) % contours[j].size()].y);
        }
        // filter 1-D signals
        vector<float> xFilt, yFilt;
        GaussianBlur(x, xFilt, Size(filterSize, filterSize), sigma, sigma);
        GaussianBlur(y, yFilt, Size(filterSize, filterSize), sigma, sigma);
        // build smoothed contour
        vector<vector<Point> > smoothContours;
        vector<Point> smooth;
        for (size_t i = filterRadius; i < contours[j].size() + filterRadius; i++)
        {
            smooth.push_back(Point(xFilt[i], yFilt[i]));
        }
        smoothContours.push_back(smooth);

        Scalar color;

        if (hierarchy[j][3] < 0)
        {
            color = Scalar(0, 0, 0);
        }
        else
        {
            color = Scalar(255, 255, 255);
        }
        drawContours(smoothed, smoothContours, 0, color, -1);
    }
    imshow("result", smoothed);
    waitKey(0);
}

问题来源:
http://stackoverflow.com/questions/37409811/smoothing-edges-of-a-binary-image

我发现中值滤波效果也很好:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('pred_5.png')
median = cv2.medianBlur(img,5)
cv2.imwrite('median.png',median)
GitHub 加速计划 / opencv31 / opencv
77.39 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:3 个月前 )
7be5181b Fixed KLEIDICV_SOURCE_PATH handling for external KleidiCV 3 天前
c3ca3f4f - 4 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐