如何围绕OpenCV轮廓而不是矩形裁剪正方形?

时间:2019-03-26 21:46:59

标签: python opencv image-processing

我有一组皮肤病变图像,我在python中使用OpenCV来检测病变并在其周围进行修剪,从而减小了尺寸(图像具有很多可以裁剪的皮肤区域)。

但是我不知道如何将生成的裁剪后的图像变成正方形。任何帮助,将不胜感激。

到目前为止,我已经对以下问题的代码进行了少许编辑:How to crop the biggest object in image with python opencv?

这是一个示例图像...我试图获得我能找到的最正常的SFW病变,对不起,如果任何人都感到不适:https://i.imgur.com/LBDl1Uf.jpg

这是代码。我一直在添加x,y,w,h(即x + 20等),以查看是否可以将其变成正方形,但是我认为这不是这样做的方法。


import cv2
import numpy as np

# load image
img = cv2.imread("ISIC_0024313.jpg")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert to grayscale
# threshold to get just the signature (INVERTED)
retval, thresh_gray = cv2.threshold(gray, thresh=160, maxval=255, \
                                   type=cv2.THRESH_BINARY_INV)

image, contours, hierarchy = cv2.findContours(thresh_gray,cv2.RETR_LIST, \
                                   cv2.CHAIN_APPROX_SIMPLE)

# Find object with the biggest bounding box
mx = (0,0,0,0)      # biggest bounding box so far
mx_area = 0
for cont in contours:
    x,y,w,h = cv2.boundingRect(cont)
    x, y, w, h = x-40, y-40, w+80,h+80 # make the bounding box a bit bigger
    area = w*h
    if area > mx_area:
        mx = x,y,w,h
        mx_area = area
x,y,w,h = mx

# Output to files
roi=img[y:y+h,x:x+w]

cv2.imshow("im",roi)
cv2.waitKey(0)

cv2.imwrite("cropped.png", roi)

这是输出。关闭但不够接近:https://i.imgur.com/zSkS4LH.png

我怎样才能确保所得到的作物是方形的?同时还提供了足够的呼吸空间来覆盖整个病变。

谢谢

1 个答案:

答案 0 :(得分:0)

您能检查一下h和w之间哪个更大,然后在选择子数组之前将两者设置为相等吗?像这样:

if h > w:
    w = h
else:
    h = w

# Then select the sub-array:
roi=img[y:y+h,x:x+w]