首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像分析.纤维识别

图像分析.纤维识别
EN

Stack Overflow用户
提问于 2011-09-12 20:25:13
回答 4查看 1.1K关注 0票数 7

我是图像分析的新手。您知道如何以这种方式对此图像进行二值化以仅获取纤维吗?

我尝试了不同的阈值技术等,但我没有成功。我不介意我应该使用什么工具,但我更喜欢.NETMatlab

PS:我不知道把我的答案放在哪里,所以我把它放在了StackOverflow上。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-14 05:42:25

根据评论,您似乎在将所提出的Mathematica解决方案转换为MATLAB时遇到了困难。这是我的尝试:

@Nakilon解决方案

代码语言:javascript
复制
%# read image
I = im2double(imread('http://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)

请注意,在边缘处存在差异。在Mathematica文档中,它含糊地说:

在图像边缘,MedianFilter/MinFilter/MaxFilter使用较小的邻域。

但是这种行为没有直接的匹配,相反,MATLAB为您提供了自定义图像边界处填充的选项。

@belisarius解决方案

代码语言:javascript
复制
%# read image
I = im2double(imread('http://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]) )

票数 4
EN

Stack Overflow用户

发布于 2011-09-12 23:09:53

下面的代码可能会有一点帮助(Mathematica中的代码):

代码语言:javascript
复制
DeleteSmallComponents[
 Binarize[
   LaplacianGaussianFilter[i, 2],
 .6],
 2]

图像合成以显示匹配:

代码语言:javascript
复制
ImageCompose[i, {i1, .4}] // ImageAdjust

票数 9
EN

Stack Overflow用户

发布于 2011-09-13 12:29:53

试试MinDetectMaxDetect

代码语言:javascript
复制
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 @@ %

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7387801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档