[英]Filtering noise from very noisy binary thresholded image
我希望能夠分析以下圖像,獲取線條並找到平均寬度。(我的副本要大得多~5K x ~4K)由於閾值化后的所有噪聲,無法進入下一步。
使用我的代碼,我能夠做到這一點......
我的問題是它的線之間有很多噪音,看起來像是被壓縮的噪音。
這是我的代碼...
image = np.copy(origImg)
newImage = np.empty_like(image)
scale = 64
height = image.shape[0]
width = image.shape[1]
dH = int(height / scale)
dW = int(width / scale)
xi = int(dH)
yi = int(dW)
fragments = []
image = cv2.bilateralFilter(image,9,75,75)
image = cv2.medianBlur(image, 21)
for i in range(0,height,dH):
for j in range(0,width,dW):
fragment = image[i:i + int(dH), j:j + int(dW)]
fragment = cv2.adaptiveThreshold(fragment, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 0)
fragments.append(fragment)
analyzed = com.stackArrayToImage(fragments)
nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(analyzed, None, None, None, 8, cv2.CV_32S)
sizes = stats[1:, -1]
img2 = np.zeros((labels.shape), np.uint8)
for i in range(0, nlabels - 1):
if sizes[i] >= 100:
img2[labels == i + 1] = 255
analyzed = cv2.bitwise_not(img2)
analyzed = cv2.erode(analyzed, np.ones((5, 5)), iterations=2)
analyzed = cv2.dilate(analyzed, np.ones((5, 5), np.uint8))
dis.plotImages([origImg], "Origional")
dis.plotImages([analyzed], "Analyzed")
dis.displayStart()
無論如何我可以消除這種噪音嗎?
非常感謝!
您可以使用cv2.contourArea
使用輪廓區域過濾去除一些噪聲。 這個想法是使用一些閾值區域進行過濾。 如果輪廓通過此過濾器,那么我們可以通過使用cv2.drawContours
填充輪廓來去除噪聲。 使用您的二進制圖像作為輸入:
檢測到的輪廓以刪除以綠色突出顯示
結果
根據要去除多少噪聲,可以調整閾值面積值
代碼
import numpy as np
import cv2
# Load image, grayscale, Otsu's threshold
image = cv2.imread("1.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Find contours and filter using contour area
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < 50:
cv2.drawContours(thresh, [c], -1, 0, -1)
cv2.drawContours(image, [c], -1, (36,255,12), -1)
result = 255 - thresh
cv2.imshow("image", image)
cv2.imshow("thresh", thresh)
cv2.imshow("result", result)
cv2.waitKey()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.