Robustere Bildverarbeitung für das Finden von Teilen in der Kameraansicht mit OpenCV? [geschlossen]

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Robustere Bildverarbeitung für das Finden von Teilen in der Kameraansicht mit OpenCV? [geschlossen]

by Anonymous » 05 Apr 2025, 11:00

Ich versuche, Teile in einem Tablett zu zählen. Sie sind eindeutig schwarz gegen einen Karton -farbige Box, also habe ich das Histogramm angesehen und ein binäres Bild basierend auf einem Prozentsatz aus dem dunkelsten Pixelwert berechnet und dann Morphologie verwendet. haben, wenn sich die Teile am Rande der Kameraansicht befinden, überlappen sie sich, die die Blob -Analyse durcheinander bringen. Am Rande der Kameraansicht < /li>
< /ul>
2 Bildszenarien < /p>
Eine intelligente Art und Weise, wie ich dies beheben könnte? Ich bin offen für alle möglichen Vorschläge, auch wenn ich mich vor der klassischen OpenCV -Bildverarbeitung scheuen und vielleicht die Klassifizierung neuronaler Netzwerk annehmen muss. < /P>

Code: Select all

def preprocess_inspection(img):
if len(img.shape) == 3:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
gray = img

hist = cv2.calcHist([gray], [0], None, [256], [0, 256])

cdf = hist.cumsum()

cdf_normalized = cdf / cdf[-1]

median_intensity = np.argmax(cdf_normalized >= 0.5)  # intensity where 50% of pixels are below

contrast = np.std(gray)

if contrast < 30:
percentage = 0.2
elif contrast < 60:
percentage = 0.15
else:
percentage = 0.1

if median_intensity < 128:
percentage = max(percentage, 0.1)

min_val, max_val, _, _ = cv2.minMaxLoc(gray)
_, thresh = cv2.threshold(gray, min_val + (max_val - min_val) * percentage, 255, 0) # % from min

return thresh

def apply_morphology(img):
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# NOTE: Image is inverted, so the operations are reversed, i.e. erode instead of dilate, etc.
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=8)
img = cv2.dilate(img, kernel, iterations=2)
return img

Top