2016-10-28 92 views
4

大家好,這是我的第一個問題,所以請溫和。我有一個計算機視覺領域的項目,我是新來的,我希望得到一些幫助。我有一個pcb的圖像,我的(首先)任務是從後臺切割電路板並將其保存到一個新文件中。如何從圖像中剪切輪廓並將其保存到新文件中

the desired result image is within the black rectangle-pic1

它不會是一個問題,如果換來的只是沒有灰色背景的普通PCB。

我到目前爲止所嘗試的是,首先將圖像轉換爲二進制使用閾值。然後我搜索使用cv2.findContours輪廓,並找到他們後,我排序的輪廓和一些研究,我發現了一種切割輪廓線,並將其保存到一個新的圖像後,提請最大

。我使用了x,y,w,h = cv2.boundingRect來查找輪廓的寬度和高度,並且僅保存輪廓以及[y:y + h,x:x + w]。問題在於,由於某些原因,使用這種方法我也需要一些背景知識,如圖3所示。

是否有任何方式切斷板,因此結果將是在圖像PIC1或至少板上的黑色矩形而不灰色背景?

UPDATE 我設法做了面具和做bitwise_and,但結果是黑色背景板。 the result有人可以幫我刪除黑色的背景,只留下圖像板? 謝謝!

+3

通過拉伸填充在白色到黑色圖像輪廓創建掩模圖像。然後在'copyTo'中使用該掩碼來僅提取源圖像的​​所需部分。另一種方法是使用帶有「bitwise_and」的掩碼來遮蓋不需要的部分。 –

+1

你能分享你用於分割輪廓的代碼嗎? – ZdaR

回答

2

我在這方面做了一些工作,並按照如下方式裁剪該區域。我認爲這是你想要的。

enter image description here

enter image description here


Basicly說,我做的圖像所執行的操作。

1. medianBlur圖像,閾值和變形操作。

2.投影到軸,閾值並得到邊界。

作物的區域。


#!/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) 
+0

這工作很好,這是我想要的,但由於某種原因res1是空的,大炮可以打開。 –

+0

您可以嘗試先顯示它,或者檢查其屬性(dtype,shape ...)以查看它是否正確。它對我來說工作得很好。 – Silencer

相關問題