Seite 1 von 1

Pixelstörungen beseitigen

Verfasst: Dienstag 15. Juli 2008, 12:03
von Xisto
Hallo ich habe folgendes Problem das ich bei einem S/W Bild kleinere Störungen habe die Bilder sind etwa um die 3072 X 2304 PIXEL Groß und haben kleinere Störungen im Bild 1 und 2 sind die in den Kreisen gemeint Bild 3 zeigt auch Störungen die im Bild vorhanden sein können. Die dicken Ecken benötige ich dürften aber auch dünner werden.

Bild Bild 1

Bild Bild 2

Bild Bild 3

Ich habe folgendes geschrieben um die Störungen zu beseitigen leider dauert das ganze über 1min und es sind leider auch nicht alle Störungen weg. Kann mir da einer von euch Helfen? Danke.

Code: Alles auswählen

import Image, ImageOps, ImagePalette, math

img=Image.open('c:\\rahmenmono3.bmp')
img = img.convert("L")

size = img.size
srcImg = img.getdata()
srcImg3 = []
lnPix = 0
zaehler = size[0] * size[1]

print zaehler
srcImg = list(img.getdata())

for x in range(0,zaehler+1,3):
     srcImg2 = srcImg[x:x+3]
     if srcImg2 == [0,255,255] or srcImg2 == [255,255,0] or srcImg2 == [255,0,255] or srcImg2 == [255,0,0] or srcImg2 == [0,0,255] or srcImg2 == [0,255,0]:
          srcImg3 = srcImg3 + [255,255,255]
     else:
          srcImg3 +=srcImg2

img.putdata(srcImg3)
img=img.save('c:\\rahmenmono4.bmp')

Verfasst: Dienstag 15. Juli 2008, 12:52
von rayo
Hi

Dürfen die Elipsen und Kreise verschwinden oder müssen diese Vorhanden bleiben?

Gruss

*edi* Kannst du ein, zwei Testbilder zur verfügung stellen?

Verfasst: Dienstag 15. Juli 2008, 13:00
von Xisto
es darf alles verschwinden nur die dicken ecken müssen zumindest teilweiße da bleiben die keise sind nur zu verdeutlichung eingezeichnet worden wo die Störungen liegen

Verfasst: Dienstag 15. Juli 2008, 13:29
von BlackJack
Ein Grund, warum Dein Quelltext sehr langsam werden kann, ist Zeile 19. `liste + liste` bedeutet es wird eine *neue* Liste erstellt, das heisst es werden, je mehr Pixel schon enthalten sind, immer mehr Werte im Speicher umherkopiert. Du solltest da besser die `extend()`-Methode verwenden, welche die vorhandene Liste erweitert.

Ansonsten könntest Du mal schauen, ob im Modul `PIL.ImageFilter` die Filter `Kernel`, `MinFilter`, oder `ModeFilter` zu gebrauchen sind.

Verfasst: Dienstag 15. Juli 2008, 13:30
von rayo
Hi

Kannst du ein/zwei Bilder zur verfügung stellen?

Du kannst mit Erosion Details verschinden lassen.
http://de.wikipedia.org/wiki/Erosion_(Bildverarbeitung)

Oder du kannst natürlich das Bild segmentieren und die Grösse der einzelnen Objekte herausfinden und nur die Grossen behalten.

Gibt viele verschiedene Möglichkeiten, Erosion ist aber glaube ich eine einfache Methode wenns egal ist wenn die grossen Blöcke kleiner werden.

Gruss

Verfasst: Dienstag 15. Juli 2008, 14:13
von Xisto
rayo hat geschrieben:
Kannst du ein/zwei Bilder zur verfügung stellen?
Hi
ich kann dir gerne ein paar bilder zukommen lassen wie möchtest du es den per ICQ oder Mail

Verfasst: Dienstag 15. Juli 2008, 14:22
von rayo
Kannst du die nicht hochladen damit sie alle zur verfügung haben?

Erosion \ Dilitation

Verfasst: Donnerstag 17. Juli 2008, 09:22
von Xisto
rayo hat geschrieben: Du kannst mit Erosion Details verschinden lassen.
http://de.wikipedia.org/wiki/Erosion_(Bildverarbeitung)
Ich kenne zwar die reine Theorie von Erosion und Dilitation leider habe ich aber nicht herrausgefunden wie dies mit Python zu realisiren ist kann mir da jemand auf die sprünge helfen.

Grüße

Verfasst: Donnerstag 17. Juli 2008, 10:00
von rayo
Hi

Also eigentlich relativ einfach, du nimmst einfach ein Strukturelement (z.B. ein Rechteck oder Kreis) und gehst an jedem Pixel kontrollieren ob alle Pixel rundum auch im Strukturelement sind.

Matlab-Code:

Code: Alles auswählen

img = imread('bild001.bmp');
[H W] = size(img);

filter = [0 1 0; 0 1 0; 0 1 0];

img2 = zeros(H,W);

for y = 2:H-1
    for x = 2:W-1
        % Teilbild herausholen
        % Muss gleich gross sein wie das Strukturelement
        sub = img(y-1:y+1,x-1:x+1);
        
        % AND-Verknüpfung mit Filter
        % überprüft ob die Pixel im Bild und die Pixel im Strukturelement
        % gleich sind
        if (sub & filter) == filter
            % Pixel im !neuen! Bild setzen
            img2(y,x) = 1;
        end
    end
end

imshow(img2);
Als Struktur habe ich eine vertikale Linie genommen, somit bleiben nur diese am Schluss übrig, bei dir wird ein Kreis am besten passen (die Grösse musst du anpassen, damit die grössten Störungen kleiner sind als der Kreis, aber die Ecken die du brauchst grösser als der Kreis sind.

Ich würde mit numpy versuchen, das bietet dir, glaube ich, ähnliche Matrizenfunktionen wie Matlab, in Python musst du sonst die AND-Verknüpfung der beiden Matrizen (Listen) von Hand machen.

Gruss