Причина, по которой вы не можете восстановить исходное изображение, не имеет ничего общего с кодом для обработки плоскости красного цвета, который работает правильно, но может быть выполнен более эффективно и кратко, используя векторизованный код, предложенный 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'});
И вот результирующий набор изображений:
Вы можете видеть, что сохранение изображения со сжатием без потерь позволяет восстановитьоригинал при повторном применении ваших шагов обработки.Вы можете подтвердить, что вернули точное то же изображение, что и оригинал, используя функцию ISEQUAL :
>> isequal(rawImg,lossyImg) %# Lossy image doesn't match; returns false
ans =
0
>> isequal(rawImg,losslessImg) %# Lossless image matches exactly; returns true
ans =
1