How can I combine bit map images to get back the original grey scale image?
6 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
C=imread('cameraman.tif'); C1=bitget(C,1); figure, imshow(logical(C1));title('Bit plane 1'); C2=bitget(C,2); figure, imshow(logical(C2));title('Bit plane 2'); C3=bitget(C,3); figure, imshow(logical(C3));title('Bit plane 3'); C4=bitget(C,4); figure, imshow(logical(C4));title('Bit plane 4'); C5=bitget(C,5); figure, imshow(logical(C5));title('Bit plane 5'); C6=bitget(C,6); figure, imshow(logical(C6));title('Bit plane 6'); C7=bitget(C,7); figure, imshow(logical(C7));title('Bit plane 7'); C8=bitget(C,8); figure, imshow(logical(C8));title('Bit plane 8');
0 Commenti
Risposta accettata
Image Analyst
il 8 Set 2016
Multiply bit plane 7 by 2^7, bitplane 6 by 2^6, and so on. Then add them all up.
0 Commenti
Più risposte (2)
IndianNigger
il 9 Dic 2016
2 Commenti
Image Analyst
il 9 Dic 2016
Several problems with that. For one, you created c9 but then never added it in. I changed it to c8. Then you multiplied by zero point two to the power instead of two to the power. This is because you used "*.2" instead of "* 2". Fixed code is below.
A demo of mine is also attached.
clc; % Clear the command window.
workspace; % Make sure the workspace panel is showing.
clearvars;
close all;
format long g;
format compact;
fontSize = 20;
grayImage = imread('cameraman.tif');
C1 = bitget(grayImage,1);
subplot(3, 3, 1);
imshow(logical(C1));
title('Bit plane 1');
C1 = im2double(C1);
C2 = bitget(grayImage,2);
subplot(3, 3, 2);
imshow(logical(C2));
title('Bit plane 2');
C2 = im2double(C2);
C3 = bitget(grayImage,3);
subplot(3, 3, 3);
imshow(logical(C3));
title('Bit plane 3');
C3 = im2double(C3);
C4 = bitget(grayImage,4);
subplot(3, 3, 4);
imshow(logical(C4));
title('Bit plane 4');
C4 = im2double(C4);
C5 = bitget(grayImage,5);
subplot(3, 3, 5);
imshow(logical(C5));
title('Bit plane 5');
C5 = im2double(C5);
C6 = bitget(grayImage,6);
subplot(3, 3, 6);
imshow(logical(C6));
title('Bit plane 6');
C6 = im2double(C6);
C7 = bitget(grayImage,7);
subplot(3, 3, 7);
imshow(logical(C7));
title('Bit plane 7');
C7 = im2double(C7);
C8 = bitget(grayImage,8);
subplot(3, 3, 8);
imshow(logical(C8));
title('Bit plane 8');
C8 = im2double(C8);
C1 = C1 * 2^0;
C2 = C2 * 2^1;
C3 = C3 * 2^3;
C4 = C4 * 2^4;
C5 = C5 * 2^5;
C6 = C6 * 2^6;
C7 = C7 * 2^7;
C8 = C8 * 2^8;
C_Rejoin1 = imadd(C1, C2);
C_Rejoin1 = imadd(C_Rejoin1, C3);
C_Rejoin1 = imadd(C_Rejoin1, C4);
C_Rejoin1 = imadd(C_Rejoin1, C5);
C_Rejoin1 = imadd(C_Rejoin1, C6);
C_Rejoin1 = imadd(C_Rejoin1, C7);
C_Rejoin1 = imadd(C_Rejoin1, C8);
subplot(3, 3, 9);
imshow(C_Rejoin1, []);
title('Joined Image');
DGM
il 20 Giu 2022
Modificato: DGM
il 20 Giu 2022
@Image Analyst Minor error here:
C1 = C1 * 2^0;
C2 = C2 * 2^1;
C3 = C3 * 2^3; % 2^2
C4 = C4 * 2^4; % 2^3
C5 = C5 * 2^5; % 2^4
C6 = C6 * 2^6; % 2^5
C7 = C7 * 2^7; % 2^6
C8 = C8 * 2^8; % 2^7
I'm assuming that's not in the attached mfile, since the screenshot looks correct. I haven't checked though.
DGM
il 20 Giu 2022
Modificato: DGM
il 20 Giu 2022
Using a bunch of numbered variables forces you into writing unnecessarily repetitive code. This can be simplified.
One way would be to simply store the images as pages in a 3D array. Just multiply this array by an appropriately-oriented vector of the corresponding powers of 2.
% using a bunch of numbered variables is a great way to waste time
% but i'm going to assume these as given
C = imread('cameraman.tif');
C1 = bitget(C,1);
C2 = bitget(C,2);
C3 = bitget(C,3);
C4 = bitget(C,4);
C5 = bitget(C,5);
C6 = bitget(C,6);
C7 = bitget(C,7);
C8 = bitget(C,8);
% rearrange the given variables into a single array
bpstack = cat(3,C1,C2,C3,C4,C5,C6,C7,C8);
% simply multiply and add
factors = uint8(2.^(0:7)); % powers of 2 (same class as bpstack!)
%bpstack = bsxfun(@times,bpstack,permute(factors,[1 3 2])); % prior to R2016b
bpstack = bpstack.*permute(factors,[1 3 2]); % R2016b and newer
outpict = uint8(sum(bpstack,3));
% show that the result matches the original
immse(outpict,C)
% show the image
imshow(outpict)
Note that the method used for multiplication depends on the version. When this question was asked, bsxfun() would have been appropriate, but for recent versions, either can be used.
The above method takes less time to write and about half to a third of the time to execute when compared to a flat repetitive approach using a pile of numbered variables.
0 Commenti
Vedere anche
Categorie
Scopri di più su Computer Vision with Simulink in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!