rgb = imread('barcode4.jpg');
% Resize Image
rgb = imresize(rgb,0.33);
figure(),imshow(rgb);
% Convert from RGB to Gray
Igray = double(rgb2gray(rgb));
% Calculate the Gradients
[dIx, dIy] = gradient(Igray);
B = abs(dIx) - abs(dIy);
% Low-Pass Filtering
H = fspecial('gaussian', 20, 10);
C = imfilter(B, H);
C = imclearborder(C);
figure(),imagesc(C);colorbar
#1 楼
如果您使用的滤镜效果很好,则可以简单地使用imrotate
创建源图像的多个旋转版本,然后对每个图像使用滤镜(请确保使用bilinear
来获取有意义的导数)#2 楼
您的方程式突出显示了X方向上的梯度幅度始终高于Y方向上的梯度幅度较大的区域。要使此功能在所有方向上均有效,那么您可能需要在任何方向上的梯度幅度都很高的区域。 >并不是说这基本上会突出显示每个边缘,但是低通滤波器将意味着您需要将多个边缘并拢。
评论
$ \ begingroup $
感谢您的编码!但是当我尝试替换公式时,我不知道将代码放在何处,一切都变成绿色。
$ \ endgroup $
–金
2012年1月30日在16:51
$ \ begingroup $
试试我的更新版本。
$ \ endgroup $
– Nzbuu
2012年1月30日19:27
$ \ begingroup $
但是现在整个图像变成红色了!
$ \ endgroup $
–金
2012年1月31日上午8:34
$ \ begingroup $
我设法使条形码垂直或水平。但是,该公式只能检测水平条形码。我可以更改公式,以便垂直和水平方向都可以检测到条形码。
$ \ endgroup $
–金
2012年2月2日,下午6:45
$ \ begingroup $
我测试了这个Furfule” B = double(sqrt(dIx。^ 2 + dIy。^ 2)> 0)“这是行不通的。
$ \ endgroup $
–user4975
13年7月5日在19:20
评论
$ \ begingroup $
感谢您的建议。如何创建多个轮换版本?抱歉,我是MatLab的新手
$ \ endgroup $
–金
2012年1月30日在16:58
$ \ begingroup $
我设法使条形码垂直或水平。但是,该公式只能检测水平条形码。我可以更改公式,以便垂直和水平方向都可以检测到条形码。
$ \ endgroup $
–金
2012年2月2日,下午6:44
$ \ begingroup $
mathworks.com/matlabcentral/fileexchange/31727-barcode-reader,您可以查看此链接
$ \ endgroup $
– Vini
2012年4月8日15:40