gpt4 book ai didi

python - OpenCV-原样绘制轮廓

转载 作者:行者123 更新时间:2023-12-02 17:13:28 25 4
gpt4 key购买 nike

我有一个似乎很简单的问题-我有一张要使用以下代码从其提取轮廓的图像-

import numpy as np
import cv2

def findAndColorShapes(inputFile):
# Find contours in the image
im = cv2.imread(inputFile)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

这样可以很好地找到图像中的轮廓,然后使用-
cv2.drawContours(fullIm, [con], -1, (0,255,0), 2)

有些形状是空心的(例如,轮廓圆),而有些则是填充的。我想以原始图像中出现的方式绘制轮廓。例如,如果轮廓是实心圆,则应使用其填充来绘制轮廓,如果轮廓只是轮廓,则应绘制轮廓。

我尝试了很多事情(其中包括将findContours中的模式更改为CHAIN_APPROX_NONE而不是CHAIN_APPROX_SIMPLE),并更改了drawContours中的第5个参数,但是没有用。

编辑:添加示例图像-左圆圈应绘制为空,而右正方形应绘制为完整。

你知道反正可以做到吗?

谢谢!

最佳答案

如果某人有一天需要做类似的事情,这就是我最终使用的代码。它不是很有效,但是效果很好,时间也不是这个项目的考虑因素(注意,我在cv2.threshold(imgray,220,255,0)中使用了红色和绿色作为轮廓阈值。您可能要更改它)-

def contour_to_image(con, original_image):
# Get the rect coordinates of the contour
lm, tm, rm, bm = rect_for_contour(con)

con_im = original_image.crop((lm, tm, rm, bm))

if con_im.size[0] == 0 or con_im.size[1] == 0:
return None

con_pixels = con_im.load()

for x in range(0, con_im .size[0]):
for y in range(0, con_im.size[1]):
# If the pixel is already white, don't bother checking it
if con_im.getpixel((x, y)) == (255, 255, 255):
continue

# Check if the pixel is outside the contour. If so, clear it
if cv2.pointPolygonTest(con, (x + lm, y + tm), False) < 0:
con_pixels[x, y] = (255, 255, 255)

return con_im

def findAndColorShapes(input_file, shapes_dest_path):
im = cv2.imread(input_file)
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 220, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

i = 0

for con in contours:
con_im = contour_to_image(con, Image.open(input_file))
if con_im is not None:
con_im.save(shapes_dest_path + "%d.png"%i)
i += 1

其中 np_to_int()rect_for_contour()是2个简单的辅助函数-
def np_to_int(np_val):
return np.asscalar(np.int16(np_val))

def rect_for_contour(con):
# Get coordinates of a rectangle around the contour
leftmost = tuple(con[con[:,:,0].argmin()][0])
topmost = tuple(con[con[:,:,1].argmin()][0])
bottommost = tuple(con[con[:,:,1].argmax()][0])
rightmost = tuple(con[con[:,:,0].argmax()][0])

return leftmost[0], topmost[1], rightmost[0], bottommost[1]

关于python - OpenCV-原样绘制轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23012623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com