如何在Matlab中提高图像质量

时间:2011-07-04 19:26:45

标签: matlab image-processing

我正在建立一个“光学字符识别”系统。

到目前为止,该系统能够识别高质量的牌照而没有任何噪音。

我希望在下一级别能够识别质量不佳的牌照,原因不同。

例如,让我们看看下一个板块:

enter image description here

如你所见,由于光线不足或其他原因,数字看起来并不清楚。

对于我的问题:如何提高图像质量,所以当我转移到二进制图像时,数字不会消失?

提前感谢。

3 个答案:

答案 0 :(得分:3)

我们可以尝试通过在图像强度上拟合线性平面来校正照明效果,这将近似于图像上的平均水平。通过从原始图像中减去此着色平面,我们可以尝试 标准化整个图像的光照条件。

对于彩色RGB图像,只需分别在每个通道上重复该过程, 甚至将它应用于不同的颜色空间(HSV,L a b *等......)

以下是一个示例实现:

function img = correctLighting(img, method)
    if nargin<2, method='rgb'; end
    switch lower(method)
        case 'rgb'
            %# process R,G,B channels separately
            for i=1:size(img,3)
                img(:,:,i) = LinearShading( img(:,:,i) );
            end
        case 'hsv'
            %# process intensity component of HSV, then convert back to RGB
            HSV = rgb2hsv(img);
            HSV(:,:,3) = LinearShading( HSV(:,:,3) );
            img = hsv2rgb(HSV);
        case 'lab'
            %# process luminosity layer of L*a*b*, then convert back to RGB
            LAB = applycform(img, makecform('srgb2lab'));
            LAB(:,:,1) = LinearShading( LAB(:,:,1) ./ 100 ) * 100;
            img = applycform(LAB, makecform('lab2srgb'));
    end
end

function I = LinearShading(I)
    %# create X-/Y-coordinate values for each pixel
    [h,w] = size(I);
    [X Y] = meshgrid(1:w,1:h);

    %# fit a linear plane over 3D points [X Y Z], Z is the pixel intensities
    coeff = [X(:) Y(:) ones(w*h,1)] \ I(:);

    %# compute shading plane
    shading = coeff(1).*X + coeff(2).*Y + coeff(3);

    %# subtract shading from image
    I = I - shading;

    %# normalize to the entire [0,1] range
    I = ( I - min(I(:)) ) ./ range(I(:));
end

现在让我们在给定的图像上进行测试:

img = im2double( imread('http://i.stack.imgur.com/JmHKJ.jpg') );
subplot(411), imshow(img)
subplot(412), imshow( correctLighting(img,'rgb') )
subplot(413), imshow( correctLighting(img,'hsv') )
subplot(414), imshow( correctLighting(img,'lab') )

enter image description here

差异很小,但可能会改善进一步图像处理和OCR任务的结果。


编辑:以下是我通过以相同方式在不同颜色空间上应用其他对比度增强技术IMADJUSTHISTEQADAPTHISTEQ获得的一些结果如上所述:

enter image description here

请记住,您必须微调任何参数以适合您的图像......

答案 1 :(得分:1)

看起来您的问题已经或多或少得到了解答(请参阅d00b的评论);但是,这里有一些基本的图像处理技巧可以帮到你。

首先,您可以尝试一个简单的imadjust。这简单地将像素强度映射到“更好”的值,这通常会增加对比度(使其更容易查看/读取)。我在工作中取得了很大的成功。它也很容易使用!我认为值得一试。

此外,this看起来很有希望,如果你只是想要一个更高分辨率的图像。

享受MATLAB中图像处理的“乐趣”!

祝你好运,

tylerthemiler

P.S。如果你将图像展平为二进制,你很可能会破坏图像,所以如果你能避免它就不要这样做!

答案 2 :(得分:1)

由于您只想查找数字(其中只有10个),您可以使用互相关。 为此你将傅立叶变换板的图片。您还可以对要匹配数字1图像的良好表示的模式进行傅里叶变换。然后在傅立叶空间中相乘并对结果进行逆傅立叶变换。

在最终的互相关中,您将看到明显的峰值,其中图案与您的图像很好地重叠。

你这样做10次并知道每个数字的位置。请注意,在进行互相关之前,必须先校正倾斜度。

此方法的优点是您无需对图像进行阈值处理。

在文献中肯定有更复杂的算法来分配车牌。例如,可以使用贝叶斯理论来估计最有可能出现的数字(如果您已经拥有可能数字的数据库,这会有很大帮助。)