逐个像素地比较图像

时间:2015-04-21 11:06:10

标签: matlab opencv

我正在研究一些图像。我获得了abc.tif图像(彩色图像)。我读了如下:

Mat test_image=imread("abc.tif",IMREAD_UNCHANGED);

我对它执行一些操作并将其转换为一些二进制图像(使用阈值),其中只包含两个值0和255,它们存储在img图像中,其中img创建如下:

Mat img(584,565,CV_8UC1);   %//(so now img contains only 0 and 255)

我使用imwrite("myimage.jpg",img);

保存此图片

我想逐个像素地将myimage.jpg图像与另一个二进制图像manual.gif进行比较,以检查一个图像是否与另一个图像重复,但是您可以注意到问题是OpenCv不支持.gif格式我需要将其转换为.jpg,因此图像会发生变化,现在两个图像都会结束,因为不同的图像可能会相同。现在做什么?

实际上我正在进行视网膜血管分割,这些图像可以在DRIVE数据库中找到。

我得到了这些照片。原始图片:

enter image description here

我对它执行一些操作并从中提取血管然后创建二进制图像并存储在一些Mat变量img中,如前所述。现在我有另一张图片(.gif图片)我无法加载,如下所示:

enter image description here

现在我想将我的img图像(二进制)与我无法加载的给定.gif图像(上图)进行比较。

2 个答案:

答案 0 :(得分:1)

使用ImageMagic以批处理模式将.gif转换为.PNG。您也可以使用system("convert img.gif img.png")调用即时转换它。

我不确定,如果像素比较会给你带来好结果。相同图像的偏移会导致不匹配。 编辑作为一个想法。也许计算重心并将两个图像移动/旋转到相同的原点可能会有所帮助。

考虑使用时刻,自由人链或其他模式稳健的形状比较方法。

答案 1 :(得分:0)

首先你会想要使用相同格式的图像@Adi提到jpg在评论中是有损的,这是正确的,所以不应该在任何工作完成之后使用。 MATLAB - image conversion

您还希望图像具有相同的尺寸。您可以使用尺寸功能比较它们,然后填充它们以添加像素以使尺寸相同。以后可以随时删除填充,只需观察添加填充的方式,以免影响操作。

您还需要研究旋转,考虑将图像放入频域并旋转图像以对齐光谱。

下面是一个简单的像素比较代码,像素比较对于比较并不是特别准确。即使是最轻微的错位对齐也会导致漏报或误报。

%read image
test_image1 = imread('C:\Users\Public\Pictures\Sample Pictures\Desert.jpg');
test_image2 = imread('C:\Users\Public\Pictures\Sample Pictures\Hydrangeas.jpg');

%convert to gray scale
gray_img1 = rgb2gray(test_image1);
gray_img2 = rgb2gray(test_image2);

% threshold image to put all values greater than 125 to 255 and all values
% below 125 to 0
binary_image1 = gray_img1 > 125;
binary_image2 = gray_img2 > 125;

%binary image to size to allow pixel by pixel checking
[row, col] = size(binary_image1);

% initialize the counters for similar and different pixelse to zero
similar = 0;
different = 0;

%two loops to scan through all rows and columns of the image. 
for kk = 1 : row
    for yy = 1 : col
        %using if statement with isequal function to compare corresponding
        %pixel values and count them depending ont he logical output of 
        %isequal 
        if isequal(binary_image1(kk,yy), binary_image2(kk,yy))
           similar = similar + 1;
        else
            different = different + 1;
        end
    end
end

% calculate the percentage difference between the images and print it
total_pixels = row*col;
difference_percentage = (different / total_pixels) * 100;
fprintf('%f%% difference between the compared images \n%d pixels being different to %d total pixels\n', difference_percentage, different, total_pixels )

% simple supbtraction of the two images
diff_image = binary_image1 - binary_image2;


%generate figure to show the original gray and corresponding binary images
%as well as the subtraction
figure
subplot(2,3,1)
imshow(gray_img1);
title('gray img1');

subplot(2,3,2)
imshow(gray_img2);
title('gray img2');

subplot(2,3,4)
imshow(binary_image1);
title('binary image1');

subplot(2,3,5)
imshow(binary_image2);
title('binary image2');

subplot(2,3,[3,6])
imshow(diff_image);
title('diff image');