How to improve image quality in Matlab

前端 未结 3 632
后悔当初
后悔当初 2021-01-14 13:47

I\'m building an \"Optical Character Recognition\" system.

so far the system is capable to identify licence plates in good quality without any noise.

<
3条回答
  •  说谎
    说谎 (楼主)
    2021-01-14 14:28

    We can try to correct for lighting effect by fitting a linear plane over the image intensities, which will approximate the average level across the image. By subtracting this shading plane from the original image, we can attempt to normalize lighting conditions across the image.

    For color RGB images, simply repeat the process on each channel separately, or even apply it to a different colorspace (HSV, Lab*, etc...)

    Here is a sample implementation:

    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
    

    Now lets test it on the given image:

    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

    The difference is subtle, but it might improve the results of further image processing and OCR task.


    EDIT: Here is some results I obtained by applying other contrast-enhancement techniques IMADJUST, HISTEQ, ADAPTHISTEQ on the different colorspaces in the same manner as above:

    enter image description here

    Remember you have to fine-tune any parameter to fit your image...

提交回复
热议问题