3 opencv 부드러운 테두리 톱니 코드

5419 단어 opencv
1 윤곽을 찾아서 처리한다
#include 
#include 
#include 

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 > contours;
    vector 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 > smoothContours;
        vector 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)

좋은 웹페이지 즐겨찾기