我正在尝试使用Simple-itk托管的dll在.bmp图像上应用CannyEdgeDetectionImageFilter。
这是我的代码:
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);
我在执行CannyEdgeDetectionImageFilter时遇到了这个异常。
sitk ::错误:像素类型:8位无符号整数的向量不是 支持2D byclass itk :: simple :: CannyEdgeDetectionImageFilter
如何将此不受支持的内容转换为支持simpleitk?
这是对我的代码的一些补充。我试图将8位无符号整数的向量转换为支持的整数,但是在这里我没有做到这一点。
CastImageFilter cast = new CastImageFilter();
PixelIDValueEnum p= cast.GetOutputPixelType();
image1= SimpleITK.Cast(image1, p);//I got below exception here.
sitk ::错误:过滤器不支持从投射向量转换 8位无符号整数到32位浮点数
我还能做些什么来处理这段代码吗?
感谢任何帮助。
答案 0 :(得分:1)
有几种方法可以将Canny滤镜应用于RGB图像。 (我认为它是一个RGB图像?)
将多组件图像转换为标量图像的方法有很多种。一个简单的演员表没有很好的定义。它可能意味着亮度,矢量幅度等......
一种选择是在图像的每个通道上独立运行算法,并获得红色边缘图像,蓝色边缘图像和绿色边缘图像。这是一些伪代码:
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)
或者,您可能需要标量边缘图像。你可以从RGB通道中获得亮度,亮度或亮度,然后只运行一次Canny过滤器。
答案 1 :(得分:0)
2D按类不支持8位无符号整数
阅读图像时需要解决问题 image = sitk.ReadImage('AAT137 B7.jpg',sitk.sitkInt8)#'AAT137 B7.jpg'是目录中的图像文件
现在,sitk.CurvatureFlow,imgWhiteMatter = sitk.ConnectedThreshold都可以使用
希望有帮助