matplotlib 搜索书本轮廓时遇到问题

i7uq4tfw  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(127)

我有一本书的图像



我需要画出它的轮廓。我试过这个:
1.使其变灰
1.模糊
1.阈
1.使用findContours()查找等值线
但它不工作!我认为这一切都取决于顶部的蓝色部分,所以我试图改变它的颜色为书的颜色与cv.inRange(),但它没有工作,轮廓仍然不清楚。然后我试图改变背景色(表的颜色)为绿色,再试一次。它工作得很好,但只有对该图像,如果我改变背景,它不工作
有时候轮廓线还包括"M"字母,可能是因为它靠近边缘
有什么办法吗?

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
gray = cv.GaussianBlur(gray, (5, 5), 0)
#at this step I also tried using cv2.Canny(gray, 75, 200)
thresh = cv.adaptiveThreshold(blurred, 255,  cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY_INV, 21, 10)
#I also tried usual threshold and THRESH_BINARY, but it works worse

contours, _ = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_TC89_KCOS)
v8wbuo2f

v8wbuo2f1#

我终于设法做到了我想要的这里有一些提示,如果你有同样的问题:
1.不要太过模糊,使用对比度图像会使情况更糟
1.不要依赖于内置函数。对我有效的是使用形态学操作而不是使用Canny()。https://ietresearch.onlinelibrary.wiley.com/doi/full/10.1049/joe.2018.9113-关于改进Canny()的文章
1.尝试改变内核以找到完美的组合
1.使用阈值类型
1.如果阈值处理效果不佳,请考虑应用蒙版以清除背景x1c 0d1x

def kernel(n,m):
    kernel = np.ones((n,m), np.uint8)

    return kernel

img_path = sys.argv[1]
image = cv.imread(img_path)
img_init = image.copy()

hsv=cv.cvtColor(img_init,cv.COLOR_BGR2HSV)
brown_lo=np.array([3,0,0])
brown_hi=np.array([18,255,255])
mask=cv.inRange(hsv,brown_lo,brown_hi)
img_init[mask>0]=(0,0,0)

gray = cv.cvtColor(img_init, cv.COLOR_BGR2GRAY)

blurred = cv.GaussianBlur(gray, (3, 3), 0)

ret,thresh = cv.threshold(blurred,150,255,cv.THRESH_TOZERO_INV)

k = ''
n, m = 100, 100
img_closed = cv.erode(cv.dilate(thresh, kernel(n,m), iterations=1), kernel(n,m), iterations=1)

n,m = 5,5
img_grad = cv.dilate(img_closed, kernel(n,m), iterations=1) - cv.erode(img_closed, kernel(n,m), iterations=1)

contours, h = cv.findContours(img_grad, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)

c = max(contours, key = cv.contourArea)

image_semi = image.copy()
image_semi_2 = image.copy()
cv.drawContours(image_semi, contours, -1, (0, 255, 0), 2)

p = cv.arcLength(c , True)
ap = cv.approxPolyDP(c, 0.02*p, True)

image_c_max = cv.polylines(image, [ap], True, (0,255,0), thickness=5)

cv.imshow("Transformations", np.hstack([ gray, blurred, thresh, img_closed, img_grad ]))
cv.imshow("Result", np.hstack([ image_semi_2 , image_semi, image_c_max ]))
cv.waitKey(0)
cv.destroyAllWindows()

相关问题