2015-05-08 9 views
5

Ich versuche, CannyEdgeDetectionImageFilter auf ein BMP-Bild mit Simple-itk verwalteten DLL anwenden.Vektor von 8-Bit-Ganzzahl ohne Vorzeichen wird nicht unterstützt

hier ist mein Code:

itk.simple.Image image1= SimpleITK.ReadImage("Input.bmp"); 

ImageFileReader read = new ImageFileReader(); 
read.SetFileName("Input.bmp"); 
read.Execute(); 

CannyEdgeDetectionImageFilter canny = new CannyEdgeDetectionImageFilter(); 
itk.simple.Image image2= canny.Execute(image1);//I got below exception here. 

ImageFileWriter write = new ImageFileWriter(); 
write.SetFileName("Output.bmp"); 
write.Execute(image2,"Output.bmp", true); 

ich diese Ausnahme bekam während CannyEdgeDetectionImageFilter Ausführung.

sitk::ERROR: Pixel type: vector of 8-bit unsigned integer is not supported in 2D byclass itk::simple::CannyEdgeDetectionImageFilter

Wie kann ich diese nicht unterstützte Sache in unterstützt für simpleitk umwandeln?

Hier ist eine Aadition zu meinem Code.Ich habe versucht, Vektor von 8-Bit unsigned Integer in unterstützt, aber hier scheitern ich dies zu tun.

CastImageFilter cast = new CastImageFilter(); 
PixelIDValueEnum p= cast.GetOutputPixelType(); 
image1= SimpleITK.Cast(image1, p);//I got below exception here. 

sitk::ERROR: Filter does not support casting from casting vector of 8-bit unsigned integer to 32-bit float

Gibt es etwas, was ich tun könnte, diesen Code zu arbeiten?

Jede Hilfe wird geschätzt.

+0

@Soner: Danke :) – Shikha

+0

Kein Problem. Denken Sie daran, gute Formatierung ist immer Ihr Freund;) –

Antwort

0

Es gibt mehrere Möglichkeiten, einen Canny-Filter auf ein RGB-Bild anzuwenden. (Ich nehme an, es ist ein RGB-Bild?)

Es gibt viele Möglichkeiten, ein Mehrkomponentenbild in ein Skalarbild zu konvertieren. Eine einfache Besetzung ist nicht gut definiert. Es könnte Luminanz, eine Vektorgröße usw. bedeuten.

Eine Option besteht darin, den Algorithmus unabhängig auf jedem Bildkanal auszuführen und ein rotes Kantenbild, ein blaues Kantenbild und ein grünes Kantenbild zu erhalten. Hier ist ein Pseudocode:

for i in range(rgbimage.GetNumberOfComponentsPerPixel()): 
    component_image = sitk.VectorIndexSelectionCast(rgbimage, i, sitk.sitkFloat32) 
    edge_images[i] = sitk.CanneyEdgeDetection(component_image) 

edge_image = sitk.Compose(edge_images) 

Alternativ können Sie ein skalares Kantenbild wünschen. Sie können die Luminanz, Helligkeit oder Helligkeit von den RGB-Kanälen ableiten und dann den Canny-Filter nur einmal ausführen.