opencv求不规则多边形面积,背景和多边形都渐变,如何进行二值化操作?

img


背景和多边形渐变,二值化操作难以进行,边缘检测也8行。
如何将背景和图片分开

我是用python的opencv尝试了解决你这个问题,应该是成功了。
主要思路是:彩色转灰度图-》直方图均衡化(为了增加对比度)-》去噪-》边缘检测(采用x,y两个方向的梯度)。
完整代码:

import cv2
import numpy as np
import copy
import math
def equal_hist_demo(img):
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    dst = cv2.equalizeHist(gray)
    dst = cv2.fastNlMeansDenoising(dst, None, 10, 10, 7)
    return dst
def filter(img):
    size = 5
    kernel1 = np.zeros((size,size), np.float32)
    kernel2 = np.zeros((size, size), np.float32)
    if size % 2 == 0:
        kernel1[0:(size / 2), :] = - 1.0 / float(size);
        kernel1[(size / 2):size, :] = 1.0 / float(size);
    else:
        kernel1[0:(size//2), :] = - 1.0 / float(size - 1);
        kernel1[(size // 2  + 1):size, :] = 1.0 / float(size - 1);
    kernel2 = np.transpose(kernel1)
    img1 = copy.deepcopy(img).astype('float32') / 255
    img2 = copy.deepcopy(img).astype('float32') / 255
    img1 = (img1 - img1.mean())/(math.sqrt(img1.var()))
    img2 = (img2 - img2.mean())/(math.sqrt(img2.var()))
    img1 = cv2.filter2D(img1, -1, kernel1)
    img2 = cv2.filter2D(img2, -1, kernel2)
    ds = img1*img1 + img2 * img2
    dst = np.zeros(tuple(ds.shape), np.uint8)
    dst[ds>1.0] = 255
    return cv2.merge([dst])
img = cv2.imread('1.png')
himg = equal_hist_demo(img)
fimg = filter(himg)
cv2.imshow("1.png",fimg)
cv2.waitKey()

效果如下所示:

img

使用自适应阈值即可cv::adaptiveThreshold,适当调整blocksize和C