如何从图像中裁剪轮廓并保存到新文件?

7
大家好,这是我的第一个问题,请温柔一点。我在计算机视觉领域有一个项目,对此我还很陌生,希望能得到一些帮助。我有一张PCB的图像,首先要做的任务是将板子从背景中剪裁出来并保存到一个新文件中。

the desired result image is within the black rectangle-pic1

如果结果只是没有灰色背景的普通pcb,那就不会有问题。
到目前为止,我尝试的方法是首先使用“threshold”将图像转换为二进制。然后使用“cv2.findContours”搜索轮廓,并在找到它们后对轮廓进行排序并绘制最大轮廓。
经过一些研究,我找到了一种切割轮廓并将其保存到新图像的方法。我使用“x,y,w,h = cv2.boundingRect”来查找轮廓的宽度和高度,“[y:y + h,x:x + w]”仅保存轮廓。问题在于,使用这种方法,由于某种原因,我也带了一些背景,如您在图片3中所见。
有没有办法切掉板子,使结果成为图像pic1中的黑色矩形或至少没有灰色背景的板子?
更新 我成功制作了掩模并进行了按位_and操作,但结果是黑色背景的板子。the result有人能帮我去掉黑色背景,只留下图像中的板子吗? 谢谢!

3
通过在黑色图像上绘制填充为白色的轮廓来创建一个掩模图像。然后使用该掩模图像在copyTo中提取源图像中仅需要的部分。另一种方法是使用bitwise_and函数将掩模应用于不需要的部分并涂黑。 - Dan Mašek
1
你能分享一下你用于轮廓分割的代码吗? - ZdaR
1个回答

3

我在这方面做了一些工作,并按照以下方式裁剪了该区域。我认为这就是您想要的。

enter image description here

enter image description here


基本上,我对图像执行以下操作。 1. 对图像进行中值模糊处理、阈值处理和形态学操作。 2. 投影到轴上,进行阈值处理并获取边界。 3. 裁剪区域。
#!/usr/bin/python3
# 2017.10.04 23:45:01 CST
# 2017.10.05 00:52:26 CST

#how to cut a contour from an image and save it to a new file

from matplotlib import pyplot as plt
import numpy as np
import cv2
import time

imgname = "pcb.jpg"
img = cv2.imread(imgname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## medianBlur, threshold and morph-close-op
median = cv2.medianBlur(gray, ksize=17)
retval, threshed = cv2.threshold(median, 110, 255, cv2.THRESH_BINARY_INV)
closed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, np.ones(15,15))

## Project to the axis
H,W = img.shape[:2]
xx = np.sum(closed, axis=0)/H
yy = np.sum(closed, axis=1)/W

## Threshold and find the nozero
xx[xx<60] = 0
yy[yy<100] = 0

ixx = xx.nonzero()
iyy = yy.nonzero()
x1,x2 = ixx[0][0], ixx[0][-1]
y1,y2 = iyy[0][0], iyy[0][-1]

## label on the original image and save it.
res1 = cv2.rectangle(img.copy(), (x1,y1),(x2,y2), (0,0,255),2)
res2 = img[y1:y2,x1:x2]
cv2.imwrite("result1.png", res1)
cv2.imwrite("result2.png", res2)

它的工作很好,这正是我想要的,但由于某些原因,res1为空,无法打开。 - Eugene Moush
你可以先尝试显示它,或者查看其属性(dtype,shape ...)以查看它是否正常。对我来说它很好用。 - Kinght 金

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接