Pixelstörungen beseitigen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Xisto
User
Beiträge: 23
Registriert: Dienstag 8. Juli 2008, 09:06

Dienstag 15. Juli 2008, 12:03

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')
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 15. Juli 2008, 12:52

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?
Xisto
User
Beiträge: 23
Registriert: Dienstag 8. Juli 2008, 09:06

Dienstag 15. Juli 2008, 13:00

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
BlackJack

Dienstag 15. Juli 2008, 13:29

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 15. Juli 2008, 13:30

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
Xisto
User
Beiträge: 23
Registriert: Dienstag 8. Juli 2008, 09:06

Dienstag 15. Juli 2008, 14:13

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 15. Juli 2008, 14:22

Kannst du die nicht hochladen damit sie alle zur verfügung haben?
Xisto
User
Beiträge: 23
Registriert: Dienstag 8. Juli 2008, 09:06

Donnerstag 17. Juli 2008, 09:22

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 17. Juli 2008, 10:00

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
Antworten