将 MATLAB 过滤器应用于 Dicom 图像的问题
Problems Applying MATLAB Filters to Dicom Images
我正在使用 dicom 胸部 PA。加载图像和进行基本的阈值处理没有问题,但是我需要应用一些过滤器。我将来会设计自己的滤波器,但现在我想使用 MATLAB 的。图像是 16 位的,在 MATLAB 文档中它说 fspecial
适用于 16 位图像。
当我尝试使用 fspecial
或 edge
函数时,我得到了与下图类似的结果。
我的问题:为什么会发生这种情况,我该如何解决?
感谢您的帮助。
此致,
full_path = 'I:\Find and Treat\Anonymized_Data[=10=]0026_20050607112512_1.dcm';
dicominfo_image = dicominfo(full_path);
dicomread_image = dicomread(dicominfo_image);
dicomread_image = mat2gray(dicomread_image);
c = imcomplement(dicomread_image);
figure,
subplot(1,3,1)
imshow(c)
f = fspecial('laplacian');
cf = filter2(f,c);
subplot(1,3,2)
imshow(cf)
f1 = fspecial('log');
cf1 = filter2(f1,c);
subplot(1,3,3)
imshow(cf1)
编辑
我添加并修改了以下代码以考虑动态范围并绘制网格图我获得了以下结果和错误消息。
Warning: Error updating LineStrip.
Update failed for unknown reason
Warning: Error updating LineStrip.
Update failed for unknown reason
figure,
subplot(2,3,1)
imshow(c, [])
f=fspecial('laplacian');
cf=filter2(f,c);
subplot(2,3,2)
imshow(cf, [])
f1=fspecial('log');
cf1=filter2(f1,c);
subplot(2,3,3)
imshow(cf1, [])
subplot(2,3,4)
mesh(c)
subplot(2,3,5)
mesh(cf)
subplot(2,3,6)
mesh(cf1)
编辑
您的图片太大。
拉普拉斯算子是一个 3x3 矩阵,近似于图像的二阶导数。您的图像是 2700x2200,这意味着在那个小尺寸(与整个图像相比)中像素的可变性可以忽略不计。如果将拉普拉斯滤波器图像绘制为 imshow(cf(300:end-300,300:end-300), [])
移除边界(实际上有很大差距),您会看得更清楚。要解决此问题,您需要或重新定义具有更高维度的拉普拉斯滤波器或将您必须的图像调整为更小的尺寸(imresize
是您的朋友)。
log
过滤器也会发生同样的情况,但在这种情况下,您可以采取一些措施。 fspecial
返回的默认日志过滤器是 5x5,但实际上您可以要求 fspecial
创建更大的过滤器。
如果你这样调用它:
f1=fspecial('log',50,0.3);
cf1=filter2(f1,c);
imshow(cf1, [])
你得到下一个数字,这看起来是一个很好的日志过滤结果。
我正在使用 dicom 胸部 PA。加载图像和进行基本的阈值处理没有问题,但是我需要应用一些过滤器。我将来会设计自己的滤波器,但现在我想使用 MATLAB 的。图像是 16 位的,在 MATLAB 文档中它说 fspecial
适用于 16 位图像。
当我尝试使用 fspecial
或 edge
函数时,我得到了与下图类似的结果。
我的问题:为什么会发生这种情况,我该如何解决?
感谢您的帮助。 此致,
full_path = 'I:\Find and Treat\Anonymized_Data[=10=]0026_20050607112512_1.dcm';
dicominfo_image = dicominfo(full_path);
dicomread_image = dicomread(dicominfo_image);
dicomread_image = mat2gray(dicomread_image);
c = imcomplement(dicomread_image);
figure,
subplot(1,3,1)
imshow(c)
f = fspecial('laplacian');
cf = filter2(f,c);
subplot(1,3,2)
imshow(cf)
f1 = fspecial('log');
cf1 = filter2(f1,c);
subplot(1,3,3)
imshow(cf1)
编辑
我添加并修改了以下代码以考虑动态范围并绘制网格图我获得了以下结果和错误消息。
Warning: Error updating LineStrip.
Update failed for unknown reason
Warning: Error updating LineStrip.
Update failed for unknown reason
figure,
subplot(2,3,1)
imshow(c, [])
f=fspecial('laplacian');
cf=filter2(f,c);
subplot(2,3,2)
imshow(cf, [])
f1=fspecial('log');
cf1=filter2(f1,c);
subplot(2,3,3)
imshow(cf1, [])
subplot(2,3,4)
mesh(c)
subplot(2,3,5)
mesh(cf)
subplot(2,3,6)
mesh(cf1)
编辑
您的图片太大。
拉普拉斯算子是一个 3x3 矩阵,近似于图像的二阶导数。您的图像是 2700x2200,这意味着在那个小尺寸(与整个图像相比)中像素的可变性可以忽略不计。如果将拉普拉斯滤波器图像绘制为 imshow(cf(300:end-300,300:end-300), [])
移除边界(实际上有很大差距),您会看得更清楚。要解决此问题,您需要或重新定义具有更高维度的拉普拉斯滤波器或将您必须的图像调整为更小的尺寸(imresize
是您的朋友)。
log
过滤器也会发生同样的情况,但在这种情况下,您可以采取一些措施。 fspecial
返回的默认日志过滤器是 5x5,但实际上您可以要求 fspecial
创建更大的过滤器。
如果你这样调用它:
f1=fspecial('log',50,0.3);
cf1=filter2(f1,c);
imshow(cf1, [])
你得到下一个数字,这看起来是一个很好的日志过滤结果。