Python 修正粗糙边缘

Python 修正粗糙边缘,python,python-2.7,opencv,image-processing,Python,Python 2.7,Opencv,Image Processing,有一幅图像是从另一幅图像中提取的,该图像是从某个高度(约130英尺)点击的。现在,当这个较小的图像被提取出来时,它包含了一个物体,它实际上有非常规则和平滑的形状,有非常粗糙的边缘。现在我想检测物体的角数(不使用轮廓)。但由于这些粗糙的边缘,检测到的角数量大大增加 以下是示例图像: 如何使边缘笔直?我想您需要的是一种简单的边缘平滑算法。我为你实现了一个。不过,它并没有将彩色标志保存在外部形状内——如果这也很重要的话——因为你在问题中没有提到这一点——你必须自己来计算这一部分。结果是: 我已经实

有一幅图像是从另一幅图像中提取的,该图像是从某个高度(约130英尺)点击的。现在,当这个较小的图像被提取出来时,它包含了一个物体,它实际上有非常规则和平滑的形状,有非常粗糙的边缘。现在我想检测物体的角数(不使用轮廓)。但由于这些粗糙的边缘,检测到的角数量大大增加

以下是示例图像:


如何使边缘笔直?

我想您需要的是一种简单的边缘平滑算法。我为你实现了一个。不过,它并没有将彩色标志保存在外部形状内——如果这也很重要的话——因为你在问题中没有提到这一点——你必须自己来计算这一部分。结果是:

我已经实现了轨迹栏,这样你就可以随心所欲地使用平滑的值。按“c”确认您选择的值

import cv2
import numpy as np


def empty_function(*arg):
    pass


def SmootherEdgesTrackbar(img, win_name):
    trackbar_name = win_name + "Trackbar"

    cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)
    cv2.resizeWindow(win_name, 1000, 500)
    cv2.createTrackbar("first_blur", win_name, 3, 255, empty_function)
    cv2.createTrackbar("second_blur", win_name, 3, 255, empty_function)
    cv2.createTrackbar("threshold", win_name, 0, 255, empty_function)

    while True:
        first_blur_pos = cv2.getTrackbarPos("first_blur", win_name)
        second_blur_pos = cv2.getTrackbarPos("second_blur", win_name)
        thresh_pos = cv2.getTrackbarPos("threshold", win_name)
        if first_blur_pos < 3:
            first_blur_pos = 3
        if second_blur_pos < 3:
            second_blur_pos = 3
        img_res = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        img_res = smoother_edges(img_res, (first_blur_pos * 2 + 1, first_blur_pos * 2 + 1),
                                 (second_blur_pos * 2 + 1, second_blur_pos * 2 + 1))
        _, img_res = cv2.threshold(img_res, thresh_pos, 255, 0)
        cv2.imshow(win_name, img_res)

        key = cv2.waitKey(1) & 0xFF
        if key == ord("c"):
            break

    cv2.destroyAllWindows()
    return img_res


def unsharp_mask(img, blur_size, imgWeight, gaussianWeight):
    gaussian = cv2.GaussianBlur(img, blur_size, 0)
    return cv2.addWeighted(img, imgWeight, gaussian, gaussianWeight, 0)


def smoother_edges(img, first_blur_size, second_blur_size=(5, 5),
                   imgWeight=1.5, gaussianWeight=-0.5):
    # blur the image before unsharp masking
    img = cv2.GaussianBlur(img, first_blur_size, 0)
    # perform unsharp masking
    return unsharp_mask(img, second_blur_size, imgWeight, gaussianWeight)


# read the image
img = cv2.imread("sample.jpg")
# smoothen edges
img = SmootherEdgesTrackbar(img, "Smoother Edges Trackbar")
# show and save image
cv2.imshow("img", img)
cv2.imwrite("result.png", img)
cv2.waitKey(0)

两个中间步骤组合在更平滑的_边()函数中

你发布的输出非常好。让我告诉你我能理解你的程序在做什么。首先,它要求用户手动设置阈值和模糊值,然后将这些值传递给其他函数,这些函数使用这些值隐式地对图像应用阈值和模糊。另外,设置阈值和模糊后,我只得到一个小的白色窗口。顺便说一下,谢谢。。我还想要一个不涉及任何手动操作的,在你找到适合你的值后,只需删除轨迹栏函数,用固定值执行步骤。算法如下:转换为灰色、模糊、反锐化遮罩、阈值。两个中间步骤组合在更平滑的_边()函数中。
convert to gray
blur
unsharp mask
threshold