我正在嘗試識別影像中的復選框
前 4 個被識別,但底部 2 個未被識別。同時,我希望能夠擺脫胡椒粉以避免誤報,因為還有其他檔案的復選標記要小得多。我嘗試了各種膨脹和內核大小,但我無法成功獲得盒子。
我試圖擴張它然后侵蝕它
kernel = np.ones((2, 2), np.uint8)
image_dilat = cv2.dilate(image, kernel, iterations=1)
kernel = np.ones((4, 4), np.uint8)
image_erosion = cv2.erode(image_dilat2, kernel, iterations=1)
我也試過變形它
kernel = np.ones((3, 3), np.uint8)
image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, iterations=1)
kernel = np.ones((3, 3), np.uint8)
image = cv2.morphologyEx(image, cv2.cv2.MORPH_CLOSE, , kernel, iterations=1)
任何建議將不勝感激。
uj5u.com熱心網友回復:
這是一種使用簡單影像處理的潛在方法:
獲取二值影像。加載圖片,轉灰度,大津的閾值。
去除小像素的噪點。使用輪廓區域過濾查找輪廓并濾除噪聲。我們通過用黑色“繪制”輪廓來有效地消除噪聲。
修復復選框墻壁。從這里我們創建一個水平和垂直修復內核,然后執行形態關閉以修復復選框墻上的任何孔。
檢測復選框。接下來在修復后的影像上找到輪廓,然后使用形狀近似和縱橫比過濾來過濾復選框輪廓。這個想法是復選框是一個正方形,并且應該具有大致相同的寬度和高度。
帶噪點的二值影像->去除微小噪點
修復復選框墻->檢測到的復選框
代碼
import cv2
# Load image, convert to grayscale, Otsu's threshold
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU)[1]
cv2.imshow('thresh before', thresh)
# Find contours and filter using contour area filtering to remove noise
cnts, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
AREA_THRESHOLD = 10
for c in cnts:
area = cv2.contourArea(c)
if area < AREA_THRESHOLD:
cv2.drawContours(thresh, [c], -1, 0, -1)
# Repair checkbox horizontal and vertical walls
repair_kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,1))
repair = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, repair_kernel1, iterations=1)
repair_kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (1,5))
repair = cv2.morphologyEx(repair, cv2.MORPH_CLOSE, repair_kernel2, iterations=1)
# Detect checkboxes using shape approximation and aspect ratio filtering
cnts, _ = cv2.findContours(repair, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.05 * peri, True)
x,y,w,h = cv2.boundingRect(approx)
aspect_ratio = w / float(h)
if aspect_ratio > 0.9 and aspect_ratio < 1.1:
cv2.rectangle(original, (x, y), (x w, y h), (36,255,12), 3)
cv2.imshow('thresh', thresh)
cv2.imshow('repair', repair)
cv2.imshow('original', original)
cv2.waitKey()
注意:假設復選框是方形的,并且沒有與復選框重疊的噪音。根據影像的不同,您可能需要添加另一層輪廓區域過濾,以確保不會出現誤報。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/472825.html
標籤:Python 图片 opencv 图像处理 计算机视觉
上一篇:如何計算到像素的距離
