デジタル画像処理ビットプレーンのスライス/圧縮

1.ビットプレーンスライス

1。概要

        ビットプレーンスライスは、画像処理で使用されるよく知られた手法です。ビットプレーンスライスは、画像圧縮で使用されます。ビットプレーンスライシングは、画像をマルチレベルのバイナリ画像に変換することです。

        これらのバイナリイメージは、さまざまなアルゴリズムを使用して圧縮されます。この手法を使用すると、重要なビットをグレースケール画像から分離できます。これは、非常に低い時間計算量でこのデータを処理するのに役立ちます。

2.ビットプレーンスライスとは何ですか?

        デジタル画像の各ピクセルのグレーレベルは、1バイト以上としてコンピュータに保存されます。

        8ビット画像の場合、0は00000000としてエンコードされ、255は11111111としてエンコードされます。0〜255の任意の数値はバイトとしてエンコードされます。

        左端のビットは最上位ビット(MSB)と呼ばれます。これは、このビットを変更すると、バイトエンコードされた値が大幅に変更される可能性があるためです。

        右端のビットは最下位ビット(LSB)と呼ばれます。これは、このビットを変更しても、エンコードされたグレースケール値があまり変更されないためです。

3.ビットプレーンスライスの主な役割

        グレースケール画像をバイナリ画像に変換します。

        より少ないビットで画像を表現し、画像をより小さなサイズにマッピングします

        焦点を合わせて画像を強調します。

4.例

(1)簡単な説明

        このような写真 

        選択した黄色の領域のピクセル値のバイナリデータは次のとおりです。

         次に、平面1に画像内のすべてのピクセルの最下位ビットが含まれていることを定義できます。

         プレーン8には、画像内のすべてのピクセルの最上位ビットが含まれています。

 (2)matlabの読み取りと表示

        matlabを使用して画像を読み取り、bitget関数を使用して各スライスを取得します。

A=imread('coins.png');

B=bitget(A,1);
figure,
subplot(2,2,1);imshow(logical(B));title('Bit plane 1');

B=bitget(A,2);
subplot(2,2,2);imshow(logical(B));title('Bit plane 2');

B=bitget(A,3);
subplot(2,2,3);imshow(logical(B));title('Bit plane 3');


B=bitget(A,4);
subplot(2,2,4);imshow(logical(B));title('Bit plane 4');

        表示される結果は次のとおりです。最初の4つのスライスのみが表示されます。

         これらのスライスが手元にあれば、それらを使用して、再構成された画像を結合または処理できます。圧縮またはフォーカスおよびその他の目的を達成するため。

2.ビットプレーン圧縮

1。概要

        これは不可逆圧縮技術です。つまり、元の画像と比較して、圧縮中に一部のデータが失われます。

2.圧縮プロセスの説明

(1)そのようなマトリックスがあります

 (2)dec2binからbinary

 (3)バイナリ表現から行列の各値の最上位ビット(MSB)を抽出します。MATLAB関数'bitget'。

 (4)各行に8列または8ビットが含まれるように上記のMSB値を再配置します。これは、行列の最後にゼロを埋めて、1行あたり8列の行列を形成することで実行できます。

 (5)各行の2進表現を10進数に変換して格納します。'bin2dec' MATLAB関数を使用して、2進値を10進値に変換します。

 3.解凍プロセスの説明

(1)圧縮データの10進値を2進形式に変換します。必要に応じて、行列に付加されている余分なゼロを削除します。

 (2)MATLAB関数 "reshape"を使用して、行列を元の行列Aのサイズに再整形します。

 (3)元の行列Aと同じサイズの行列を事前に割り当て、行列の各値のMSB(最上位ビット)を前の手順で解凍したビットに置き換えます。MATLAB関数'bitset'を使用します

 (4)これから、このビットスライスの元のデータを取得します

 4.マトリックスの例

(1)圧縮マトリックス

clear all
clc

A = [180 4 80 33 201; 120 27 11 160 28; 224 1 133 67 144];
A = uint8(A);

%Encoding

%Check whether zeros has to be appended to the matrix
rem = mod(numel(A),8);
if rem~=0
rem = 8-rem;
end

%Extract the MSB
bit8 = bitget(A,8);
b8 = bit8';
b8 = b8(:);
b8 = [b8;zeros(rem,1)];

%Reshape the matrix as such each row contains 8 columns
mat8 = reshape(b8,8,[])';
str8 = num2str(mat8);
str8 = str8(:,1:3:end);

%Convert the binary to decimal
compressedbit8 = uint8(bin2dec(str8));

(2)データを解凍します

%Decoding

%Convert Decimal to Binary
decompressedbit8 = dec2bin(compressedbit8,8);

%Reshape the matrix to the size of original matrix size
%And remove extra zeros appended to the matrix
dbit8 = decompressedbit8';
dbit8 = dbit8(:);
dbit8 = dbit8(1:end-rem);
dbit8 = reshape(dbit8,size(A,2),size(A,1))';

%Preallocate a matrix
Image = zeros([size(A,1) size(A,2)]);
slice8 = zeros([size(A,1) size(A,2)]);

%Set the MSB with the binary values obtained from decompressed matrix
ind_bit8 = find(dbit8=='1');
slice8(ind_bit8) = 1;
Image = bitset(Image,8,slice8);
Image = uint8(Image);

%Display data
display(Image);

5.画像の例

(1)678ビットを抽出します

%ENCODING
clear all
clc


%INPUT IMAGE
A = imread('cameraman.tif');

%Encoding
bitnums = [6;7;8]; %BIT PLANES

%CHECK IF PADDING WITH ZEROS IS NEEDED OR NOT
rem = mod(numel(A),8);
if(rem~=0)
rem = 8-rem;
end

%EXTRACT EACH BIT AND STORE IT IN THE MATRIX

forinc =1:length(bitnums)

Ind = bitnums(inc);

%EXTRACT THE 'n'th BIT
bitval = bitget(A,Ind);

%PAD WITH ZEROS AND RESHAPE THE MATRIX
bval = bitval';
bval = bval(:);
bval = [bval;zeros(rem,1)];

matv = reshape(bval,8,[])';
strv = num2str(matv);
strv = strv(:,1:3:end);

%CONVERT BINARY TO DECIMAL
compressedbitv(:,inc) = uint8(bin2dec(strv));

end

%STORE THE COMPRESSED DATA IN A FILE
%OPTIONAL
fp = fopen('compressed_data678.data','wb');
fwrite(fp,compressedbitv','uint8');
fclose(fp);

(2)画像を読んで復元する

%DECOMPRESSION
clear all
clc

%INPUT FROM THE USER
M = 256; %SIZE OF THE ORIGINAL IMAGE
N = 256; %SIZE OF THE ORIGINAL IMAGE
bitnums = [6;7;8]; %BIT PLANES USED

rem = mod(M*N,8);

if(rem~=0)
rem = 8-rem;
end

%READ THE COMPRESSED DATA
fp = fopen('compressed_data678.data','rb');
compressedbitv = fread(fp,[length(bitnums),Inf],'uint8')';
fclose(fp);

%PREALLOCATE THE MATRIX
Image = zeros([M N]);
forinc = 1:length(bitnums)

Ind = bitnums(inc);

%CONVERT DECIMAL TO BINARY
decompressedbitv = dec2bin(compressedbitv(:,inc),8);

%REMOVE EXTRA ZEROS AND RESHAPE THE MATRIX
dbitv = decompressedbitv';
dbitv = dbitv(:);
dbitv = dbitv(1:end-rem);
dbitv = reshape(dbitv,N,M)';

%SET THE 'n'th BIT
slicev = zeros([M N]);
ind_bitv = find(dbitv == '1');
slicev(ind_bitv) = 1;
     Image = bitset(Image,Ind,slicev);

end

%DISPLAY THE IMAGE
Image = uint8(Image);
figure,imagesc(Image);colormap(gray);

(3)サンプル写真

7、8スライス

 

2468スライス

 

おすすめ

転載: blog.csdn.net/bashendixie5/article/details/123603381