我有一個帶有 4 組點的黑白影像,我需要將每組轉換為一個點。
我的想法是通過距離找到洗掉點,所以如果一個像素可能與另一個像素相距 20 像素,我會轉而洗掉一個并保留另一個,并重復該程序直到我只有 4 個像素,但這似乎并不真的有利于性能。
有沒有更好的方法可以做到這一點?
謝謝
圖片:

uj5u.com熱心網友回復:
您的想法與可行的解決方案相去甚遠。您可以制作一個簡單的演算法,其作業原理如下:
以光柵順序掃描影像,直到遇到白色像素,
從這個像素,通過種子填充擦除整個連接的組件,
恢復初始像素并繼續掃描到影像的末尾。
擦掉,
將當前像素設定為黑色,
在所有白色鄰居上遞回(您可以考慮具有共同邊緣的四個像素,以及可選地與角接觸的四個像素)。
請注意,如果連接的組件組件很大,則可能會發生堆疊溢位。還要注意影像的邊緣像素(缺少一些鄰居)。
該演算法非常有效,因為它只會訪問黑色像素一次,而白色像素只會訪問兩次(白色時一次,擦除后第二次)。
uj5u.com熱心網友回復:
這是一個可能的解決方案。基本上,我檢測原始影像上的四個斑點,獲取它們的邊界框并計算它們的centroids。我flood-fill在這個位置使用黑色的質心,然后在同一位置繪制一個像素。
但是,您的影像是巨大的和壓縮的。我調整了它的大小(如果你不想調整它,你可以保留scalePercentat 100),將它轉換為grayscale然后threshold它 - 正如我所說,你的影像被壓縮并且一些像素不是真正的白色,所以閾值給了我一個真正的二進制影像:
# imports:
import cv2
# Set image path
imagePath = "C://opencvImages//"
imageName = "juPHJ.jpg"
# Read image:
inputImage = cv2.imread(imagePath imageName)
# Resize percent:
scalePercent = 20
# Calculate new dimensions:
newWidth = int(inputImage.shape[1] * scalePercent / 100)
newHeight = int(inputImage.shape[0] * scalePercent / 100)
# Resize image
inputImage = cv2.resize(inputImage, (newWidth, newHeight))
# Input deep copy
inputCopy = inputImage.copy()
# Convert BGR to grayscale:
grayInput = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)
# Get binary image via Otsu:
_, binaryImage = cv2.threshold(grayInput, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)
現在,讓我們提取白色斑點,獲取它們的邊界框,計算質心并flood-fill相應地計算:
# Extract blobs:
contours, _ = cv2.findContours(binaryImage, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Loop through the blobs, get their bounding boxes:
for i, c in enumerate(contours):
# Get blob bounding box:
x, y, w, h = cv2.boundingRect(c)
# Compute centroid:
cx = int(x 0.5 * w)
cy = int(y 0.5 * h)
# Flood-fill at the center:
fillPosition = (cx, cy)
fillColor = (0, 0, 0)
cv2.floodFill(binaryImage, None, fillPosition, fillColor, loDiff=(10, 10, 10), upDiff=(10, 10, 10))
# Draw a pixel at the center:
binaryImage[cy, cx] = 255
# Show new Image:
cv2.imshow("New Image", binaryImage)
cv2.waitKey(0)
這是輸出(不過,您必須真正放大才能看到單個像素):

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/404754.html
標籤:
上一篇:k表示影像分割后,有什么功能或方法可以顯示影像簇嗎?
下一篇:高斯核
