所謂灰度圖像,即指8位256顏色的圖像。將圖像的每一位分別取出來,我們就可以將一幅圖像分解開來,形成8幅圖像。下面我們分別介紹使用matlab分解圖像與使用halcon/c++分解圖像的方法。
matlab8位分解
clc;
clear all;
A = imread('lena.tif');
% 顯示原始圖像
subplot(3,3,1);
imshow(A);title('原始圖像');
% 顯示8個位平面圖像
for i=8:-1:1A_bitplane = bitshift(bitget(A,i),i-1);subplot(3, 3, 9-i+1);imshow(A_bitplane);title(['位平面 ' num2str(i)]);
end
效果:
matlab8位合并復原
clc;
clear all;
A = imread('lena.tif');
Array=cell(1,8);
% 顯示8個位平面圖像
for i=8:-1:1Array{i} = bitshift(bitget(A,i),i-1);
end %%%復原
%%定義全0矩陣
[M,N]=size(Array{1});
B=zeros(M,N,'uint8');for i=1:8B=bitset(B,i,bitget(Array{i},i));
end
figure;
subplot(1,2,1);
imshow(A);title('原始圖像');
subplot(1,2,2)
imshow(B);title('復原后圖像');
結果:
halcon分解
方法一,自己實現
void Bit()
{using namespace Halcon;cout << endl << "Shifting & cutting out bit values:" << endl;HByteImage image("mreut");HWindow w(0,0,image.Width(),image.Height());w.SetPart(0,0,image.Height()-1,image.Width()-1);image.Display(w);int i;cout << "- cutting out bit slices" << endl; for (i=0; i<8; i++) {HRegion reg = (image & (1<<i)) != 0; //按照位切片w.ClearWindow();reg.Display(w);cout << " & bit " << i << endl;}}
方法二,使用自帶函數
void Bit()
{using namespace Halcon;cout << endl << "Shifting & cutting out bit values:" << endl;HByteImage image("mreut");HWindow w(0,0,image.Width(),image.Height());w.SetPart(0,0,image.Height()-1,image.Width()-1);image.Display(w);int i;cout << "- cutting out bit slices2" << endl;for (i = 0; i < 8; i++){HRegion reg = (image.BitSlice(i+1)) != 0; //按照位切片w.ClearWindow();reg.Display(w);cout << " & bit " << i << endl;}}
附加matlab一個好的教程:
- http://www-rohan.sdsu.edu/doc/matlab/toolbox/images/images.html
- bitget,bitset說明文檔
參考文獻:
1.?MATLAB實現256色灰度圖像的8位平面分解
2.?Matlab bitget() 函數的使用
