Old*_*vec 7 c# matlab f# wolfram-mathematica image-processing
我是图像分析的新手.你知道如何以这种方式将这种图像二值化以获得光纤吗?
我尝试了不同的门限技术等,但我没有成功.我不介意我应该使用什么工具,但我更喜欢.NET
或Matlab
.
PS:我不知道在哪里提出答案,所以我把它放在StackOverflow上.
以下可能有所帮助(Mathematica中的代码):
DeleteSmallComponents[
Binarize[
LaplacianGaussianFilter[i, 2],
.6],
2]
Run Code Online (Sandbox Code Playgroud)
图像组成以显示匹配:
ImageCompose[i, {i1, .4}] // ImageAdjust
Run Code Online (Sandbox Code Playgroud)
尝试MinDetect
和MaxDetect
.
s = Sharpen @ ImageAdjust @ originalimage
{min, max} = {s~MinDetect~.3, s~MaxDetect~.7}
min~MedianFilter~5~MinFilter~5~MaxFilter~25~MinFilter~20
{min~ImageSubtract~%, max~ImageMultiply~%}
ImageAdd @@ %
Run Code Online (Sandbox Code Playgroud)
根据评论,您似乎很难将建议的 Mathematica 解决方案转换为 MATLAB。这是我的尝试:
%# read image
I = im2double(imread('https://i.stack.imgur.com/6KCd1.jpg'));
%# ImageAdjust[]
II = I;
for k=1:size(II,3)
mn = min(min( II(:,:,k) )); mx = max(max( II(:,:,k) ));
II(:,:,k) = ( II(:,:,k) - mn ) ./ (mx-mn);
end
%# Sharpen[]
II = imfilter(II, fspecial('unsharp'));
%# MinDetect[], MaxDetect[]
II = rgb2gray(II);
mn = imextendedmin(II,0.3,8);
mx = imextendedmax(II,0.7,8);
%# pad image because Mathematica handles border cases differently than MATLAB
pad = 30;
q = padarray(mn, [pad pad], 'symmetric', 'both');
q = medfilt2(q, [5 5]*2+1, 'symmetric'); %# MedianFilter[]
q = ordfilt2(q, 1, ones(2*5+1), 'symmetric'); %# MinFilter[]
q = ordfilt2(q, (25*2+1)^2, ones(25*2+1), 'symmetric'); %# MaxFilter[]
q = ordfilt2(q, 1, ones(20*2+1), 'symmetric'); %# MinFilter[]
%# un-pad image
q = q(pad+1:end-pad, pad+1:end-pad, :);
%# ImageSubtract[], ImageMultiply[], ImageAdd[]
a = imsubtract(mn,q)==1; %# a = mn; a(q) = false;
b = immultiply(mx,q); %# b = mx & q;
c = imadd(a,b); %# c = a | b;
%# show images
figure(1)
subplot(121), imshow(mn)
subplot(122), imshow(mx)
figure(2), imshow(q)
figure(3)
subplot(121), imshow(a)
subplot(122), imshow(b)
figure(4), imshow(c)
Run Code Online (Sandbox Code Playgroud)
请注意,边缘处存在差异。在 Mathematica 文档中,它含糊地说:
在图像的边缘,MedianFilter/MinFilter/MaxFilter 使用较小的邻域。
但这种行为没有直接匹配,相反,MATLAB 为您提供了自定义图像边界填充的选项。
%# read image
I = im2double(imread('https://i.stack.imgur.com/6KCd1.jpg'));
%# LaplacianGaussianFilter[]
II = imfilter( I , fspecial('log', [2 2]*2+1, (2*2+1)/2) );
%# ImageAdjust[]
for k=1:size(II,3)
mn = min(min( II(:,:,k) )); mx = max(max( II(:,:,k) ));
II(:,:,k) = ( II(:,:,k) - mn ) ./ (mx-mn);
end
%# Binarize[]
BW = im2bw(II, 0.6);
%# DeleteSmallComponents[]
BW = bwareaopen(BW, 2, 8);
%# show images
figure
subplot(121), imshow(BW)
subplot(122), imshow( imoverlay(I,BW,[0 1 0]) )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1012 次 |
最近记录: |