当前位置: 首页 > 面试题库 >

如何裁剪轮廓的内部区域?

任长卿
2023-03-14
问题内容

我正在处理视网膜眼底图像。图像由黑色背景上的圆形视网膜组成。使用OpenCV,我设法获得了围绕整个圆形视网膜的轮廓。我需要的是从黑色背景中裁剪出圆形视网膜。


问题答案:

在您的问题中尚不清楚,您是要实际裁剪轮廓中定义的信息还是要屏蔽与所选轮廓无关的信息。我将探讨在两种情况下该怎么做。

假设您cv2.findContours在图像上运行,您将收到一个列出图像中所有可用轮廓的结构。我还假设您知道用来包围所需对象的轮廓的
索引
。假设将其存储在中idx,首先用于将该轮廓cv2.drawContours
填充 版本绘制到空白图像上,然后使用该图像索引到图像中以提取出对象。该逻辑 掩盖 了所有不相关的信息,只保留了重要的信息-
在所选轮廓中定义了重要信息。假设您的图像是存储在中的灰度图像,则执行此操作的代码应类似于以下内容img


import numpy as np
import cv2
img = cv2.imread('...', 0) # Read in your image
# contours, _ = cv2.findContours(...) # Your call to find the contours using OpenCV 2.4.x
_, contours, _ = cv2.findContours(...) # Your call to find the contours
idx = ... # The index of the contour that surrounds your object
mask = np.zeros_like(img) # Create mask where white is what we want, black otherwise
cv2.drawContours(mask, contours, idx, 255, -1) # Draw filled contour in mask
out = np.zeros_like(img) # Extract out the object and place into output image
out[mask == 255] = img[mask == 255]

# Show the output image
cv2.imshow('Output', out)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果你真的想种…

如果要 裁剪
图像,则需要定义轮廓定义的区域的最小跨度边界框。您可以找到边界框的左上角和右下角,然后使用索引来裁剪出所需的内容。该代码将与以前相同,但是将有一个附加的裁剪步骤:

import numpy as np
import cv2
img = cv2.imread('...', 0) # Read in your image
# contours, _ = cv2.findContours(...) # Your call to find the contours using OpenCV 2.4.x
_, contours, _ = cv2.findContours(...) # Your call to find the contours
idx = ... # The index of the contour that surrounds your object
mask = np.zeros_like(img) # Create mask where white is what we want, black otherwise
cv2.drawContours(mask, contours, idx, 255, -1) # Draw filled contour in mask
out = np.zeros_like(img) # Extract out the object and place into output image
out[mask == 255] = img[mask == 255]

# Now crop
(y, x) = np.where(mask == 255)
(topy, topx) = (np.min(y), np.min(x))
(bottomy, bottomx) = (np.max(y), np.max(x))
out = out[topy:bottomy+1, topx:bottomx+1]

# Show the output image
cv2.imshow('Output', out)
cv2.waitKey(0)
cv2.destroyAllWindows()

裁剪代码的工作原理是,当我们定义蒙版以提取轮廓所定义的区域时,我们还会找到定义轮廓左上角的最小水平和垂直坐标。同样,我们找到了定义轮廓左下角的最大水平和垂直坐标。然后,我们使用这些坐标的索引来裁剪实际需要的内容。请注意,这会对
蒙版 图像进行裁切,该图像将除去除最大轮廓中包含的信息以外的所有内容。

注意与OpenCV 3.x

应该注意的是,以上代码假定您使用的是OpenCV2.4.x。请注意,在OpenCV
3.x中,的定义cv2.findContours已更改。具体来说,输出是一个三元素元组输出,其中第一个图像是源图像,而其他两个参数与OpenCV
2.4.x中的相同。因此,只需更改cv2.findContours以上代码中的语句即可忽略第一个输出:

_, contours, _ = cv2.findContours(...) # Your call to find contours


 类似资料:
  • Canvas中的剪辑区域,是由路径所定义的一块区域,浏览器会把所有的绘图操作都限制在该区域内执行。 Canvas中,使用clip()方法来设定剪辑区域,一旦设定好裁剪区域,则只有落在裁剪区域内的图形才能绘制出来,在裁剪区域以外进行绘制将没有任何效果。默认的剪辑区域是整个画布。 由于剪辑区域是由路径所定义的区域,所以,必须先调用beginPath()方法绘制一个路径,然后,才能通过clip()方法把

  • 创建区划图层时,在高级设置内,可以对图层进行重叠、不重叠选择: 重叠 :即同一图层内区划面之间可以叠加显示 例如:绘制区划16,区划16与北京朝阳区、通州区有重叠部分,但是不会被裁掉,会重叠显示 不重叠:即同一图层内区划面之间无缝拼接显示 例如:绘制区划17时,与朝阳区、通州区均有相交,但是绘制完成后,自动裁剪相交部分 区划创建步骤: 步骤一:先创建区划图层 新建区划图层,点击“区划”,自定义图层

  • 我有3个maven项目A、B、C。A是B的父项目,B是C的父项目。所有概要文件都在pom中定义。项目A的xml。 在项目C中,我试图根据所选概要文件在spring测试上下文中选择属性文件(在src/test/resources下)。对于回归测试,我们有两个属性文件: 本地应用程序测试。属性 在我们的Windows开发系统上,选定的配置文件将是“本地”的,相应地在服务器上也是如此。选择“本地”配置文

  • 默认情况下,背景颜色的显示范围为 border-box 区域,不重复的背景图像的显示范围为 padding-box 区域,而重复的背景图像的显示范围为 border-box 区域。然而,有时候却希望控制背景的显示范围。 这时,就可以通过 background-clip属性用来定义元素背景的裁剪区域,即背景的显示范围,可选值有 border-box | padding-box | content-b

  • 我试图在从图库中选择图像后使用intent来裁剪图像。以下是我的代码片段 在这里,我使用PICK_IMAGE_REQUEST意图句柄调用上面的代码段 由于我在裁剪后使用了相同的意图,即PICK_IMAGE_REQUEST,可能会出现什么问题

  • 主要内容:1. outline-style,2. outline-width,3. outline-color,4. outline,5. outline-offset轮廓(outline)是绘制于元素周围的一条线,位于边框的外围(紧贴着边框),主要用来突出显示某个元素,如下图所示: 图:轮廓(outline) 轮廓和边框看起来非常相似,但它们之间也并非没有区别,例如: 元素上下左右四个方向上边框的样式、宽度、颜色可以单独设置,而轮廓在元素四个方向的宽度、样式、颜色都是相同的,不能单独设置; 边