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



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

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

到目前为止,我已经稍微编辑了这个问题的代码:如何使用python opencv裁剪图像中最大的对象?

下面是一个示例图像...我试图得到我能找到的最正常的SFW病变,对不起,如果它让任何人感到恶心:https://i.stack.imgur.com/fqt1g.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.stack.imgur.com/iLWN8.png

我如何确保所得作物是方形的?同时也提供足够的呼吸空间来覆盖整个病变。

谢谢

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

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

最新更新