使用 OpenCV 和 Python 裁剪图像的轮廓

Posted

技术标签:

【中文标题】使用 OpenCV 和 Python 裁剪图像的轮廓【英文标题】:Crop Contures of Image with OpenCV and Python 【发布时间】:2018-01-28 15:26:51 【问题描述】:

我正在尝试找出医学图像重要部分的图像大小,如下所示。我正在使用 OpenCV 和 Python。

我必须先裁剪图像以去除图像周围的黑色空间。 这是我的代码:

import cv2
import numpy as np

img = cv2.imread('image-000.png')

height, width, channels = img.shape     #shape of original image

height_2 = height * 7/100
width_2 = width * 15/100

img[0:height_2, 0:width_2] = [0, 0, 0]    #get rid of the watermark on the top left

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,15,255,cv2.THRESH_BINARY)

_, contours, _= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]

x,y,w,h = cv2.boundingRect(cnt)

crop = img[y:y+h,x:x+w]

height_2, width_2, channels_2 = crop.shape
print "height: " + repr(height_2)
print "width: " + repr(width_2)


cv2.waitKey(0)
cv2.destroyAllWindows()

此代码适用于上图:

但是,当我想对其他图像使用相同的代码时,它不起作用。 例如这不起作用:

你知道我做错了什么吗? 非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

问题是您在第二张图片中发现多于 1 个轮廓。只需将您的行 cnt = contours[0] 替换为 cnt = max(contours, key=cv2.contourArea),它就会为您获得最大的轮廓。

【讨论】:

非常感谢您的快速回答!效果很好!

以上是关于使用 OpenCV 和 Python 裁剪图像的轮廓的主要内容,如果未能解决你的问题,请参考以下文章

Python and OpenCV - 为啥用 OpenCV 处理的裁剪图像仍然可以影响原始图像?

如何使用 Python 和 OpenCV 裁剪图像中的多个 ROI

使用 OpenCV Python 以与参考图像相同的方向和尺寸转换和显示裁剪图像

Opencv和python用于自动裁剪

使用 Python 的 OpenCV 函数裁剪图像 [重复]

使用 Python 和 OpenCV 合并这两张裁剪皮肤和原始自拍的图像?