Почему XOR, красный канал изображения RGB, сохранение, перезагрузка и XORing снова, не возвращает исходное изображение? - PullRequest
1 голос
/ 02 марта 2011

Это код, который я использую для изменения значения красного

pic=imread('farooq1.jpg');
[imr,imc,clr]=size(pic);

for row=1:imr
    for col=1:imc
        for k=1:clr  
          if(k==1) 
            img2(row,col,k)=bitxor(pic(row,col,k),66);
          else
            img2(row,col,k)=pic(row,col,k);   
          end
        end
    end
end

imwrite(img2,'farooq_scr.jpg');
imshow(img2);

Но когда я снова использую этот же код в результирующем файле для отмены XORing, результат не соответствует исходному изображению.

Пожалуйста, предложите мне, если вы знаете лучший способ сделать это.

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Причина, по которой вы не можете восстановить исходное изображение, не имеет ничего общего с кодом для обработки плоскости красного цвета, который работает правильно, но может быть выполнен более эффективно и кратко, используя векторизованный код, предложенный Jonas :

img2 = pic;
img2(:,:,1) = bitxor(img2(:,:,1),66);

Проблема, с которой вы столкнулись, связана с форматом, в котором вы сохраняете файл изображения. По умолчанию файлы изображений JPEG созданы с использованием IMWRITE сохраняются с использованием сжатия с потерями для уменьшения размера файла.Это приводит к потере информации об изображении, что делает невозможным восстановление исходного изображения при загрузке этого изображения и повторной обработке.

Вы можете устранить проблему, указав, что сжатие без потерь используется при сохранении вашего изображения JPEG, например:

imwrite(img2,'farooq_scr.jpg','Mode','lossless');


ПРИМЕР:

Вот пример использования изображения JPEG 'greens.jpg', которое входит в комплектПанель инструментов обработки изображений:

rawImg = imread('greens.jpg');  %# Load the original image
subplot(2,2,1);
imshow(rawImg);                 %# Display the original image
title('Original Image');

modImg = rawImg;                           %# Initialize a modified image
modImg(:,:,1) = bitxor(modImg(:,:,1),66);  %# Modify the red plane of the image
subplot(2,2,2);
imshow(modImg);                            %# Display the modified image
title('Modified Image');

imwrite(modImg,'lossy_image.jpg');     %# Save with lossy compression
lossyImg = imread('lossy_image.jpg');          %# Reload the image
lossyImg(:,:,1) = bitxor(lossyImg(:,:,1),66);  %# Reprocess the image
subplot(2,2,3);
imshow(lossyImg);                              %# Display the image
title({'Using Lossy Image' 'to Recover Original'});

imwrite(modImg,'lossless_image.jpg',...      %# Save with lossless compression
        'Mode','lossless');
losslessImg = imread('lossless_image.jpg');          %# Reload the image
losslessImg(:,:,1) = bitxor(losslessImg(:,:,1),66);  %# Reprocess the image
subplot(2,2,4);
imshow(losslessImg);                                 %# Display the image
title({'Using Lossless Image' 'to Recover Original'});

И вот результирующий набор изображений:

enter image description here

Вы можете видеть, что сохранение изображения со сжатием без потерь позволяет восстановитьоригинал при повторном применении ваших шагов обработки.Вы можете подтвердить, что вернули точное то же изображение, что и оригинал, используя функцию ISEQUAL :

>> isequal(rawImg,lossyImg)     %# Lossy image doesn't match; returns false
ans =
     0
>> isequal(rawImg,losslessImg)  %# Lossless image matches exactly; returns true
ans =
     1
0 голосов
/ 02 марта 2011

Вы должны убедиться, что новый образ того же класса, что и старый.Также вы можете избавиться от нескольких петель

pic = imread('peppers.png');

%# initialize img2 to the same size and same class as pic
%# by making it a copy of pic
img2 = pic;

%# apply bitxor to the red channel
img2(:,:,1) = bitxor(pic(:,:,1),66);

%# write the data
imwrite(img2,'peppers_scr.png')
imshow(img2)

%# show that the reverse works
img3 = imread('peppers_scr.png');
img3(:,:,1) = bitxor(img3(:,:,1),66);
figure %# create new figure 
imshow(img3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...