(Digitale Bildverarbeitung MATLAB+Python) Kapitel 9 Bildmorphologische Operationen – Abschnitt 3: Morphologische Verarbeitung von Binärbildern

1: Morphologische Filterung

(1. Übersicht

Morphologische Filterung : Hierbei handelt es sich um eine Bildverarbeitungstechnik, die häufig in der digitalen Bildverarbeitung verwendet wird, um die Qualität von Bildern zu verbessern, bestimmte Bildmerkmale zu extrahieren oder Bildrauschen zu entfernen. Die morphologische Filterung basiert hauptsächlich auf morphologischen Operationen und wirkt über Strukturelemente (auch Templates genannt) auf lokale Bereiche des Bildes und verändert dadurch die Form und Struktur des Bildes. Durch die Auswahl von Strukturelementen unterschiedlicher Form (z. B. isotroper Kreise, Kreuze, Rechtecke, gerichteter Liniensegmente mit unterschiedlicher Ausrichtung usw.) und unterschiedlicher Größe können unterschiedliche Merkmale des Bildes extrahiert werden

(2) Verfahren

Wie folgt: Implementieren Sie die Merkmalsextraktion von Binärbildern

Fügen Sie hier eine Bildbeschreibung ein


Matlab-Implementierung :

I=imread(‘pattern.jpg’);
BW1=im2bw(I,h);
BW1=1-BW1;
se=strel('square',3); 
BW2=1-imopen(BW1,se);
figure;imshow(BW2);title('矩形块提取');
se45=strel('line',25,45);     
BW3=1-imopen(BW1,se45);
figure;imshow(BW3);title('线段提取');

Python-Implementierung :

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

# 读取图像
I = cv2.imread('pattern.jpg', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW1 = cv2.threshold(I, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
BW1 = 255 - BW1

# 矩形块提取
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
BW2 = cv2.morphologyEx(BW1, cv2.MORPH_OPEN, se)
BW2 = 255 - BW2

# 显示矩形块提取结果
plt.imshow(BW2, cmap='gray')
plt.title('矩形块提取')
plt.show()

# 线段提取
se45 = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
se45 = cv2.rotate(se45, cv2.ROTATE_90_CLOCKWISE)
BW3 = cv2.morphologyEx(BW1, cv2.MORPH_OPEN, se45)
BW3 = 255 - BW3

# 显示线段提取结果
plt.imshow(BW3, cmap='gray')
plt.title('线段提取')
plt.show()

2: Bildglättung

(1. Übersicht

Bildglättung : Dies ist eine wichtige Aufgabe in der digitalen Bildverarbeitung. Sie trägt dazu bei, Rauschen und Details im Bild zu reduzieren und das Bild glatter und kontinuierlicher zu machen. Durch die Kombination von Öffnungs- und Schließvorgängen kann eine umfassendere Glättung des Bildes erreicht werden. Erstens werden durch den Öffnungsvorgang kleine Geräusche und diskontinuierliche Bereiche entfernt, Kanten geglättet und gleichzeitig größere Strukturen erhalten. Dann können Schließvorgänge verwendet werden, um Löcher zu füllen, Bereiche zu verbinden, Fehler und Brüche zu beseitigen und das Bild kontinuierlicher und glatter zu machen. Die morphologische Transformation zum Glätten von Binärbildern ist

Y = ( X ∘ S ) ⋅ SY = ( X ⋅ S ) ∘ S S} \\\boldsymbol{Y}=(\boldsymbol{X} \cdot \boldsymbol{S}) \circ \boldsymbol{S}\end{array}Y=( XS )SY=( XS )S

In der Abbildung unten ist beispielsweise das Strukturelement SS zu sehenS ist größer als die Größe aller Rausch- und Rauschblöcke

Fügen Sie hier eine Bildbeschreibung ein

(2) Verfahren

wie folgt

Fügen Sie hier eine Bildbeschreibung ein


Matlab-Implementierung :

Image=imread('A.bmp');
BW=im2bw(Image);
SE=strel('square',3);
result1=imclose(imopen(BW,SE),SE); 
figure,imshow(result1);
result2=imopen(imclose(BW,SE),SE);               
figure,imshow(result2);

Python-Implementierung :

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

# 读取图像
Image = cv2.imread('A.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 创建结构元素
SE = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 先开运算再闭运算
result1 = cv2.morphologyEx(cv2.morphologyEx(BW, cv2.MORPH_OPEN, SE), cv2.MORPH_CLOSE, SE)

# 显示结果1
plt.imshow(result1, cmap='gray')
plt.show()

# 先闭运算再开运算
result2 = cv2.morphologyEx(cv2.morphologyEx(BW, cv2.MORPH_CLOSE, SE), cv2.MORPH_OPEN, SE)

# 显示结果2
plt.imshow(result2, cmap='gray')
plt.show()

Drei: Bildkantenextraktion

(1. Übersicht

Bildkantenextraktion : Dies ist eine wichtige Aufgabe in der digitalen Bildverarbeitung. Sie hilft dabei, die Kanten- und Konturinformationen im Bild hervorzuheben, um die weitere Analyse und Verarbeitung zu erleichtern. Durch die Kombination des Öffnungsvorgangs und des Schließvorgangs kann die Kantenextraktion des Bildes realisiert werden. Erstens können durch das Anwenden von Schließvorgängen die Löcher und Brüche im Bild gefüllt, Kantenbereiche verbunden und die Kanten kontinuierlicher gemacht werden. Anschließend werden offene Operationen angewendet, um Kanten zu glätten, kleine isolierte Punkte und dünne Linien zu entfernen und Kantenmerkmale hervorzuheben. Morphologische Transformation zum Extrahieren von Konturkanten von Objekten

  • Innere Grenze : Y = X − (Y=X( XS )
  • Äußerer Rand : Y = ( X ⊕ S ) − X \boldsymbol{Y}=(\boldsymbol{X} \oplus \boldsymbol{S})-\boldsymbol{X}Y=( XS )X
  • Morphologischer Gradient : Y = (})Y=( XS )( XS )

In der folgenden Abbildung wird beispielsweise das Strukturelement SS verwendetS- Paar-BildXXX für Kantenextraktion

Fügen Sie hier eine Bildbeschreibung ein

[Externer Link Bildübertragung fehlgeschlagen. Die Quellseite verfügt möglicherweise über einen Anti-Leeching-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-ZwmGF6cR-1685365220132) (Bild/Kapitel 9 Bildmorphologische Operationen – Abschnitt 3: Morphologie von Binärbilder lernen zu verarbeiten/image-20230529202220478.png)]

(2) Verfahren

wie folgt

Fügen Sie hier eine Bildbeschreibung ein


Matlab-Implementierung :

Image=imread('menu.bmp');
BW=im2bw(Image);
SE=strel('square',3);
result1=BW-imerode(BW,SE); 
result2=imdilate(BW,SE)-BW; 
result3=imdilate(BW,SE)-imerode(BW,SE);     
figure,imshow(result1);
figure,imshow(result2);
figure,imshow(result3);

Python-Implementierung :

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

# 读取图像
Image = cv2.imread('menu.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 创建结构元素
SE = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 边缘提取结果1
result1 = BW - cv2.erode(BW, SE)

# 显示结果1
plt.imshow(result1, cmap='gray')
plt.show()

# 边缘提取结果2
result2 = cv2.dilate(BW, SE) - BW

# 显示结果2
plt.imshow(result2, cmap='gray')
plt.show()

# 边缘提取结果3
result3 = cv2.dilate(BW, SE) - cv2.erode(BW, SE)

# 显示结果3
plt.imshow(result3, cmap='gray')
plt.show()

Viertens: Flächenfüllung

(1. Übersicht

Überblick : Dies ist eine häufige Aufgabe in der digitalen Bildverarbeitung. Sie hilft dabei, Löcher oder Brüche im Bild zu füllen und benachbarte Bereiche zu verbinden, um die Bereiche im Bild kontinuierlich und vollständig zu machen. Durch die Kombination des Öffnungsvorgangs und des Schließvorgangs kann die Flächenfüllung des Bildes realisiert werden. Erstens können durch Anwenden des Öffnungsvorgangs kleine Löcher, Brüche und isolierte Punkte im Bild entfernt werden, wodurch die Kanten des Bereichs zusammenhängender werden. Anschließend wird der Schließvorgang angewendet, um die Löcher zu füllen und die Bereiche zu verbinden, sodass die Bereiche im Bild vollständig und kontinuierlich sind.

X k = ( X k − 1 ⨁ S ) ∩ AC , k = 1 , 2 , 3 , ⋯ , \quad k=1,2,3, \cdotsXk=( Xk 1S )AC ,k=1 ,2 ,3 ,

Wie in der folgenden Abbildung dargestellt, werden Grenzpunkte in Grau dargestellt und haben den Wert 1. Alle Nicht-Randpunkte sind weiße Teile und haben den Wert 0

Fügen Sie hier eine Bildbeschreibung ein

(2) Verfahren

wie folgt

Fügen Sie hier eine Bildbeschreibung ein


Matlab-Implementierung :

Image=imread('coin.bmp');
BW=im2bw(Image);
imshow(BW); title('二值图像');
result1=imfill(BW,'holes');
figure,imshow(result1);title('二值图像的区域填充');

Python-Implementierung :

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

# 读取图像
Image = cv2.imread('coin.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示二值图像
plt.imshow(BW, cmap='gray')
plt.title('二值图像')
plt.show()

# 区域填充
result1 = cv2.fillHoles(BW)

# 显示区域填充结果
plt.imshow(result1, cmap='gray')
plt.title('二值图像的区域填充')
plt.show()

Fünftens: Zielerkennung (Trefferänderung oder nicht)

(1. Übersicht

Zielerkennung (Treffer-oder-Nicht-Transformation) : Das Prinzip der Treffer-oder-Nicht-Transformation nutzt die Korrosionseigenschaften – der Korrosionsprozess entspricht dem Prozess der Markierung der Positionen, an denen Strukturelemente gefüllt werden können. Die Objekterkennung muss sowohl die Innenseite als auch die Außenseite des Ziels erkennen, d. h. sowohl interne als auch externe Markierungen müssen in einem Vorgang erfasst werden. Daher werden zur Zielerkennung zwei Strukturelemente S 1 S_{1} benötigtS1S 2 S_{2}S2, ein Strukturelementpaar bildend S = ( S 1 , S 2 ) S=(S_{1},S_{2})S=( S1,S2)

  • S 1 S_{1}S1: Innerhalb des Ziels erkennen
  • S 2 S_{2}S2: Außerhalb des Ziels erkennen

dann Bild XXX verwendet das StrukturelementSSS ändert sich, ob es trifft oder nicht, was aufgezeichnet wird als

X ∗ S = ( X ⊖ S 1 ) ∩ ( XC ⊖ S 2 ) 2 + x ⊆ XC } \begin{array}{l}\boldsymbol{X} * \boldsymbol{S}=\left(\boldsymbol{X} \ominus \boldsymbol{S}_{\mathbf{1}}\ rechts) \cap\left(\boldsymbol{X}^{\boldsymbol{C}} \ominus \boldsymbol{S}_{\mathbf{2}}\right) \\\boldsymbol{X} * \boldsymbol{S }=\left(\boldsymbol{X} \ominus \boldsymbol{S}_{\mathbf{1}}\right) \cap\left(\boldsymbol{X}^{\boldsymbol{C}} \bigoplus \widehat {\boldsymbol{S}}_{\mathbf{2}}\right) \\\boldsymbol{X} * \boldsymbol{S}=\left\{\boldsymbol{x} \mid \boldsymbol{S}_{ \mathbf{1}}+\boldsymbol{x} \subseteq \boldsymbol{X} \quad \text { und } \quad \boldsymbol{S}_{\mathbf{2}}+\boldsymbol{x} \subseteq \ Boldsymbol{X}^{\boldsymbol{C}}\right\}\end{array}XS=( XS1)( XCS2)XS=( XS1)( XCS 2)XS={ xS1+XX Und S2+XXC }

Genau dann, wenn das Strukturelement S 1 S_{1}S1Schwenken Sie zu einem bestimmten Punkt, um die Menge XX auszufüllenInnerhalb von X , Strukturelement S 2 S_{2}S2Der Punkt wird nur dann in die Ausgabe der Hit-Miss-Transformation einbezogen, wenn der Punkt an die Außenseite der ausfüllbaren Menge verschoben wird.

Im Bild unten ist (a) beispielsweise ein Bild XX , das aus vier Objekten besteht: einem Rechteck, einem kleinen Quadrat, einem großen Quadrat und einem großen Quadrat mit einem kleinen hervorstehenden Teil.X ; (b) ist das StrukturelementpaarS = ( S 1 , S 2 ) S=(S_{1},S_{2})S=( S1,S2) . Es ist erforderlich, das Quadrat korrekt identifizieren zu können, indem man berechnet, ob es getroffen wurde oder nicht.

Fügen Sie hier eine Bildbeschreibung ein

Der Effekt ist wie folgt

Fügen Sie hier eine Bildbeschreibung ein

(2) Verfahren

wie folgt

Fügen Sie hier eine Bildbeschreibung ein


Matlab-Implementierung :

Image=imread('test.bmp');
BW=im2bw(Image);                 
interval=[-1  -1  -1  -1  -1
                  -1  -1  -1  -1  -1
                  -1  -1  1   1   1
                  -1  -1  1   1   1
                  -1  -1  1   1   1];      %定义结构元素对
result=bwhitmiss(BW,interval);   %击中击不中
figure,imshow(result); title('击中与否变换结果');

Python-Implementierung :

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

# 读取图像
Image = cv2.imread('coin.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示二值图像
plt.imshow(BW, cmap='gray')
plt.title('二值图像')
plt.show()

# 区域填充
result1 = cv2.fillHoles(BW)

# 显示区域填充结果
plt.imshow(result1, cmap='gray')
plt.title('二值图像的区域填充')
plt.show()

Sechs: Verfeinerung

(1. Übersicht

Verfeinerung : Die skelettierte Struktur ist eine wichtige topologische Beschreibung des Zielbildes. Beim Ausdünnen des Zielbilds wird das zentrale Grundgerüst des Bilds ermittelt. Dabei werden die Linien geometrischer Elemente wie Text, Kurven und gerade Linien auf dem Bild entlang der Mittelachse in Linien mit einer Breite von einem Pixel ausgedünnt. Der Ausdünnungsalgorithmus basiert auf einer mathematischen morphologischen Transformation

X ⊙ S = X − ( X ∗ S ) \boldsymbol{X} \odot \boldsymbol{S}=\boldsymbol{X}-(\boldsymbol{X} * \boldsymbol{S})XS=X( XS )

Es ist ersichtlich, dass die Verfeinerung tatsächlich aus der Menge XX stammtEntfernen Sie das strukturierte ElementSS aus XDas Ergebnis von S- Treffer. Die verwendete spezifische Verfeinerungsmethode ist

X 1 = X ⊙ S , X 2 = X 1 ⊙ S , ⋯ ⋯ X n = X n − 1 ⊙ S S}, \boldsymbol{X}_{\mathbf{2}}=\boldsymbol{X}_{\mathbf{1}} \odot \boldsymbol{S}, \cdots \cdots \boldsymbol{X}_{n }=\boldsymbol{X}_{n-1} \odot \boldsymbol{S}X1=XS ,X2=X1S ,⋯⋯Xn=Xn 1S

Beispiel wie unten

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

(2) Verfahren

wie folgt

Fügen Sie hier eine Bildbeschreibung ein


Matlab-Implementierung :

Image=imread('menu.bmp');
BW=im2bw(Image); 
result1=bwmorph(BW,'thin',1); 
result2=bwmorph(BW,'thin',Inf); 
figure,imshow(result1);title('细化一次');
figure,imshow(result2);title('细化至只有一个像素宽');

Python-Implementierung :

Image=imread('menu.bmp');
BW=im2bw(Image); 
result1=bwmorph(BW,'thin',1); 
result2=bwmorph(BW,'thin',Inf); 
figure,imshow(result1);title('细化一次');
figure,imshow(result2);title('细化至只有一个像素宽');

おすすめ

転載: blog.csdn.net/qq_39183034/article/details/130936558