Vla*_*mir 10 matlab machine-learning image-processing
我的问题是使用拖车后部的图像自动查找和计算卡车中的木材.我试图使用MATLAB Image Toolbox解决这个问题.所以,这是我的代码.
function [ centers, rads, metrics ] = TimberFind( img )
minrad = 20;
maxrad = 110;
Hsens = .93;
CannySens = .20;
img_gray = rgb2gray(img);
PSF = fspecial('gaussian', 5, 0.5);
img_gray = imfilter(img_gray, PSF, 'symmetric', 'conv');
img_gray = imadjust(img_gray);
PSF=fspecial('gaussian', 10, 1);
Blurred = imfilter(img_gray, PSF, 'symmetric', 'conv');
cont = imsubtract(img_gray, Blurred);
preprocessed = imadd(img_gray, 3*cont);
bin = edge(preprocessed, 'canny', CannySens);
[cen, r, m] = imfindcircles(bin, [minrad maxrad],'Sensitivity', Hsens);
end
Run Code Online (Sandbox Code Playgroud)
但结果并不是很好.您可以看到完整的数据集或以下示例:

因此,如果我使Canny和imfindcircles算法足够灵敏地检测所有木材,那么会发现一些过量的反应.我有一个想法,就是从大图像中删除每个木材,然后构建一些获得小图片的全局标准,并尝试一些机器学习算法来解决这个问题.但我认为这种方式相当困难,所以也许有人可以提出其他建议吗?也许有更好的方法在使用Canny运算符之前对图像进行预处理?如果你有任何想法如何做到更好,请告诉我.谢谢!
实际上,实际上并不需要对图像进行预处理,即在使用imfindcircles.
代码的简化版本在此图像上给出了非常不错的结果:

代码:
minrad = 20;
maxrad = 110;
Hsens = .93;
[cen, r] = imfindcircles(img, [minrad maxrad],'Sensitivity', Hsens);
Run Code Online (Sandbox Code Playgroud)
结果:

有趣的是,结果比原始代码的效果要好得多。越简单越好!