背景和多边形渐变,二值化操作难以进行,边缘检测也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()
效果如下所示: