Python-Bildverarbeitung – Bildsegmentierung und farbbasierte Bildsegmentierung klassischer Fälle

Im Vorwort
führt der Autor im ersten Teil in die Grundkenntnisse der Bildverarbeitung ein, im zweiten Teil werden Bildberechnung und Bildverbesserung vorgestellt und im dritten Teil werden wir die klassischen Fälle der Bildsegmentierung und Bildverarbeitung ausführlich erläutern. Dieser Teil gehört zur Bildverarbeitung auf hohem Niveau. Wissen kann unser Verständnis und unsere praktischen Fähigkeiten weiter vertiefen. Bei der Bildsegmentierung handelt es sich um die Technologie und den Prozess zur Aufteilung eines Bildes in mehrere Bereiche mit einzigartigen Eigenschaften und zur Extraktion interessanter Objekte. Sie ist ein wichtiger Schritt in der Bildverarbeitung und Bildanalyse. Es ist hauptsächlich in schwellenbasierte Segmentierungsmethoden, bereichsbasierte Segmentierungsmethoden, kantenbasierte Segmentierungsmethoden und spezifische theoriebasierte Segmentierungsmethoden unterteilt. In diesem Artikel wird die farbbasierte Bildsegmentierungsmethode ausführlich erläutert.

1. Farbbasierte Bildsegmentierung

Die Farbsegmentierung ist eine wichtige Technologie in der Bildverarbeitung. Sie kann verschiedene Farben in einem Bild für Anwendungsszenarien wie Zielerkennung und Bilderkennung trennen.

Das Algorithmusprinzip der Farbsegmentierung ist relativ einfach und wird normalerweise auf der Grundlage der Transformation des Farbraums realisiert. Zu den häufig verwendeten Farbräumen gehören RGB, HSV, LAB usw., wobei der HSV-Farbraum besser für Farbsegmentierungsaufgaben geeignet ist. Der HSV-Farbraum unterteilt Farben in drei Kanäle: Farbton, Sättigung und Wert.

  • Farbton: Gibt die Art oder den Typ der Farbe an, z. B. Rot, Blau, Grün usw.
  • Sättigung: Gibt die Reinheit der Farbe an. Je gesättigter die Farbe ist, desto lebendiger ist sie und umgekehrt.
  • Helligkeit: Bezieht sich auf die Helligkeit und Dunkelheit einer Farbe. Bei der Farbe gilt: Je höher die Helligkeit, desto heller die Farbe; je niedriger die Helligkeit, desto dunkler die Farbe.

Die Grundidee der Farbsegmentierung besteht darin, Pixel unterschiedlicher Farbe durch Schwellenwertbildung zu segmentieren. Insbesondere können wir das Bild vom RGB-Farbraum in den HSV-Farbraum konvertieren und dann einen geeigneten Schwellenwert (normalerweise die maximalen und minimalen Werte für Farbton, Sättigung und Helligkeit) auswählen, um das Bild in schwarze und weiße Teile zu unterteilen .

Im OpenCV-HSV-Farbraum

  • Der Maximalwert des Farbtons (Hue) beträgt 179 Grad und der Minimalwert 0 Grad, was die Position der Farbe im Farbkreis darstellt.

  • Der Maximalwert der Sättigung beträgt 255 und der Minimalwert 0, was die Reinheit und Grauskala der Farbe darstellt.

  • Der Maximalwert der Helligkeit beträgt 255 und der Minimalwert 0, was die Helligkeit und Dunkelheit der Farbe darstellt.

Implementierungsschritte
Basierend auf den oben genannten Algorithmusprinzipien können wir die folgenden Schritte ausführen, um eine Farbsegmentierung zu erreichen:

  1. Konvertieren Sie ein Bild vom RGB-Farbraum in den HSV-Farbraum.
  2. Berechnen Sie die maximalen und minimalen Werte für Farbton, Sättigung und Helligkeit
  3. Legen Sie den Schwellenwert fest, um das Bild in schwarze und weiße Teile aufzuteilen.
  4. Verwenden Sie morphologische Operationen, um Rauschen zu entfernen und das endgültige Segmentierungsergebnis zu erhalten.

In diesem Artikel wird die Funktion cv2.inRange() in OpenCV verwendet, um eine farbbasierte Segmentierung des Ziels im Bild durchzuführen.

mask = cv2.inRange(src, Lowerb, Upperb[, dst])

– Der src-Parameter ist das Eingabebild, das einkanalig oder mehrkanalig sein kann, und der Datentyp ist np.uint8
– mask ist das Ausgabebild, bei dem es sich um ein Einkanalbild (Binärbild) handelt, und die Daten Typ ist derselbe wie das Eingabebild
– Lowerb ist die angegebene Untergrenze vom Typ Skalar, die ein einzelner Wert oder ein Tupel oder eine Liste mehrerer Werte sein kann – Upperb ist
die angegebene Obergrenze vom Typ Skalar, die a sein kann einzelner Wert oder ein Tupel oder eine Liste mehrerer Werte

Hinweis:
Die Maske stellt die Positionsinformationen der Pixel dar, die dem angegebenen Farbbereich entsprechen. Das heißt, der entsprechende Pixelwert der Pixel innerhalb des angegebenen Farbbereichs im Binärbild beträgt 255, und die Pixel, die nicht im angegebenen Farbbereich liegen, sind in dem Binärbild Der entsprechende Pixelwert ist 0. Daher können wir mit dieser Maske das Bild selektiv bearbeiten und nur Pixel innerhalb des angegebenen Farbbereichs verarbeiten, ohne andere Pixel zu beeinträchtigen

Das Folgende ist ein einfacher Farbsegmentierungscode, der auf dem oben genannten Algorithmusprinzip basiert (die Maske selbst gibt einen bestimmten Bereich an):

import cv2
import numpy as np

# 读入图片
img = cv2.imread( "C:/Users/Administrator/Desktop/flower.png")

# 转换颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义绿色范围
lower_green = np.array([40, 50, 50])
upper_green = np.array([90, 255, 255])

# 定义黄色范围
lower_yellow = np.array([15, 50, 50])
upper_yellow = np.array([40, 255, 255])

# 根据颜色范围创建掩码
mask_green = cv2.inRange(hsv, lower_green, upper_green)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)

# 合并掩码
mask = cv2.bitwise_or(mask_green, mask_yellow)

# 应用掩码
result = cv2.bitwise_and(img, img, mask=mask)

# 显示结果
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

Die Laufergebnisse sind in Abbildung 1-1 dargestellt. Die Sonnenblumen sind in der Abbildung gut segmentiert, aber auch das Gras ist segmentiert.
Fügen Sie hier eine Bildbeschreibung ein
Im Folgenden sind die HSV-Bereiche einiger gängiger Farben aufgeführt:

Rot: (0, 70, 50) – (10, 255, 255) oder (170, 70, 50) – (179, 255, 255)

Orange: (10, 70, 50) - (25, 255, 255)

Gelb: (25, 70, 50) - (35, 255, 255)

Grün: (35, 70, 50) - (85, 255, 255)

Cyan: (85, 70, 50) - (100, 255, 255)

Blau: (100, 70, 50) - (130, 255, 255)

Lila: (130, 70, 50) - (170, 255, 255)

Weiß: (0, 0, 221) - (180, 30, 255)

Schwarz: (0, 0, 0) - (180, 255, 30)

2. Bestimmen Sie den Farbwertebereich anhand des Histogramms

Wenn das zu segmentierende Farbziel keine größeren Störungen im Bild aufweist, kann der Wertebereich des Farbziels durch Beobachtung des Histogramms der Farbtonkomponente (Hue) als Grenzstandard für unsere Segmentierung bestimmt werden.

Das Codebeispiel lautet wie folgt:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")
# BGR图转为HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 提取hsv中H通道数据
h = hsv[:, :, 0].ravel()
# 直方图显示
plt.hist(h, 180, [0, 180])
plt.show()

Rufen Sie das Histogramm ab, wie in Abbildung 2-1 dargestellt:
Fügen Sie hier eine Bildbeschreibung ein
Gemäß dem im Einspruch erwähnten HSV-Bereich allgemeiner Farben erscheint im 30. bis 70. Teil des Histogramms eine große Datenmenge, sodass festgestellt werden kann, dass die oberen und unteren Bereiche sind Die unteren Grenzwerte der grünen H-Komponente liegen bei 30–70. Der SV-Grenzwert kann grob anhand des im Einspruch vorgeschlagenen HSV-Bereichs festgelegt und beim Extrahieren der Maske angepasst und bestimmt werden

Die Maskenmaske wird unten durch die grüne Grenze von HSV erzeugt. Code wie folgt anzeigen:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# HSV 的下界限
lower_red = np.array([35,70,50])
# HSV 的上界限
upper_red = np.array([70,255,255])

# 通过上下限提取范围内的掩模mask
mask = cv2.inRange(hsv, lower_red, upper_red)

img =  cv2.resize(img,(500,500))
mask = cv2.resize(mask,(500,500))

cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

Das Laufergebnis ist in Abbildung 2-2 dargestellt
Fügen Sie hier eine Bildbeschreibung ein

Es kann festgestellt werden, dass der allgemeine Umriss des Grases extrahiert wurde, es jedoch viele schwarze Flecken auf dem Feld gibt. Dies liegt daran, dass die meisten schwarzen Flecken im Dunkeln liegen und wir sie herausfiltern können, indem wir die Untergrenze von reduzieren Der V-Wert. Hier wird die untere Grenze des V-Werts durch festgelegt. Die ursprünglichen 50 werden auf 15 angepasst

Der Effekt ist wie folgt:
Fügen Sie hier eine Bildbeschreibung ein
Zu diesem Zeitpunkt können einige schwarze Flecken nicht durch V-Anpassung entfernt werden. Wir können Expansion, Korrosion und andere Mittel verwenden, um unabhängige weiße Flecken oder schwarze Flecken zu beseitigen.

Der Code zur Beseitigung schwarzer Flecken lautet wie folgt:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# HSV 的下界限
lower_green = np.array([35,70,15])
# HSV 的上界限
upper_green = np.array([70,255,255])

# 通过上下限提取范围内的掩模mask
mask = cv2.inRange(hsv, lower_green, upper_green)

# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 35))
# 图像闭运算
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=2)

img =  cv2.resize(img,(500,500))
mask = cv2.resize(mask,(500,500))

cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

Der Effekt ist in Abbildung 2-3 dargestellt.
Fügen Sie hier eine Bildbeschreibung ein
Es ist ersichtlich, dass die schwarzen Punkte entfernt werden, und dann verwenden wir cv2.bitwise_and(), um bitweise das Originalbild und die Maske zu extrahieren, um das Grasbild zu extrahieren:
Fügen Sie hier eine Bildbeschreibung ein

Farbaustausch

Durch die oben genannten Vorgänge können wir die von uns angegebene Farbe bereits genau segmentieren und dann ihre Farbe auf einer zweiten Basis ändern, z. B. in Gelb. Dies muss ebenfalls im HSV-Farbraum ausgeführt werden, diesmal jedoch dort Es ist kein Schließvorgang an der Maske erforderlich.

Verwenden Sie die Funktion createTrackbar, um hsv hier anzupassen

cv2.createTrackbar(trackbarName, windowName, value, count, onChange)

  • trackbarName: der Name der ziehbaren Leiste, String-Typ.
  • windowName: Der Name des Fensters, in dem sich die verschiebbare Leiste befindet, String-Typ.
  • Wert: der Standardwert der ziehbaren Leiste, Ganzzahl.
  • count: der Maximalwert des verschiebbaren Balkens, Ganzzahl.
  • onChange: Die Rückruffunktion, die aufgerufen wird, wenn sich der Wert der ziehbaren Leiste ändert, Funktionstyp.

Code wie folgt anzeigen:

import cv2
import numpy as np

def nothing(x):
    pass
#通过OpenCV读取图片信息
img = cv2.imread("C:/Users/Administrator/Desktop/scenery.jpg")

img = cv2.resize(img,(500,500))
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.imshow("img", img)

# HSV 的下界限
lower_green = np.array([35,70,15])
# HSV 的上界限
upper_green = np.array([70,255,255])

cv2.namedWindow('img2',cv2.WINDOW_NORMAL)

cv2.createTrackbar('H','img2',140,180,nothing)
cv2.createTrackbar('S','img2',100,180,nothing)
cv2.createTrackbar('V','img2',117,180,nothing)
rows,cols,channels = img.shape

while(1):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower_green, upper_green)
    #将制定像素点的数据设置为0, 要注意的是这三个参数对应的值是Blue, Green, Red。
    h = cv2.getTrackbarPos('H', 'img2')
    s = cv2.getTrackbarPos('S', 'img2')
    v = cv2.getTrackbarPos('V', 'img2')
    for r in range(rows):
        for c in range(cols):
            if mask[r, c] == 255:
                hsv.itemset((r, c, 0), hsv.item(r, c, 0) -h)
                hsv.itemset((r, c, 1), hsv.item(r, c, 1) +90-s)
                hsv.itemset((r, c, 2), hsv.item(r, c, 2) +90-v)
    img2 = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    #将图像进行输出,使用show()也是可以显示的。
    img = cv2.resize(img, (500, 500))
    cv2.imshow("img2", img2)
    k = cv2.waitKey(1)&0xFF
    if k == 27: #esc exit
        break

#cv2.waitKey(0)
cv2.destroyAllWindows()

Fügen Sie hier eine Bildbeschreibung ein

3. Zusammenfassung

In diesem Blog wird die Verwendung von Python und OpenCV für die Farbsegmentierung vorgestellt, die den HSV-Farbraum und den Schwellenwertsegmentierungsalgorithmus verwendet. Zu den Schritten zur Farbsegmentierung gehören: Lesen von Bilddateien, Konvertieren von Farbräumen, Berechnen von Schwellenwerten, Segmentieren von Bildern, Entfernen von Rauschen usw. Durch den Beispielcode können wir den Implementierungsprozess der Farbsegmentierung besser verstehen.

Ich denke du magst

Origin blog.csdn.net/weixin_44598554/article/details/130627957
Empfohlen
Rangfolge