【问题标题】:How to crop a square shape around OpenCV contours, not rectangle?如何在 OpenCV 轮廓周围裁剪正方形,而不是矩形?
【发布时间】:2019-08-17 09:34:21
【问题描述】:

我有一组皮肤病变图像,我在 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

我怎样才能确保最终的裁剪是方形的?同时也提供足够的呼吸空间来覆盖整个病变。

谢谢

【问题讨论】:

  • 所有答案都必须包括一些简单的边界检查。 IE。将 min-x/y 或 max-x/y 离开图像的边缘。我的建议是在你把它变成方形之前不要做你的填充(-40 等),然后如果有空间,把它垫掉。我也将从使用 h/w 差异的一半开始居中,这样它就更加居中了。此外,如果您希望为分类器创建数据,您可能希望单独存储坐标而不是裁剪......这将允许生成器生成一些动态裁剪。
  • @user1269942 等待填充直到我制作一个正方形听起来是个好主意,只需要弄清楚如何制作一个正方形。

标签: python opencv image-processing


【解决方案1】:

您能否在选择子数组之前检查一下 h 和 w 之间哪个更大并设置两者相等?比如:

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

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

【讨论】:

  • 一个班轮:roi = img[y: y + max(h, w), x: x + max(h, w)]
  • 它会很挑剔,但你需要检查你的界限。
  • @user1269942 我认为当前代码也是如此,因为原始代码在不检查最大值的情况下向每个维度添加随机 80 像素。
  • 同意。我建议他在操作结束时添加额外的填充。这里有一个优雅的解决方案的机会......去吧!
猜你喜欢
  • 1970-01-01
  • 2018-02-13
  • 2013-10-05
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2018-03-11
  • 2021-09-01
相关资源
最近更新 更多