数字图像处理 实验六:方块编码(BTC)

DIP实验6:方块编码(BTC)

实验目的

掌握方块编码的基本方法及压缩性能。

实验内容

1)编程实现子块为n×n的方块编码算法;
2)分别取n=4和8的方块尺寸进行实验,计算重建图像的PSNR和压缩比。

输出图像排列格式如下:

原图像4×4BTC重建图像8×8BTC重建图像

参考代码

figure('NumberTitle', 'off', 'Name', '实验6:方块编码(BTC)');
OI = imread('lena.bmp');    % 原始图像读取 
[len, wid] = size(OI);
    
rebuildImg1 = BTC2(OI, 4);
rebuildImg2 = BTC2(OI, 8);

subplot(1,3,1); imshow(OI); title('原图像');
subplot(1,3,2); imshow(rebuildImg1); title('4×4BTC重建图像');
subplot(1,3,3); imshow(rebuildImg2); title('8×8BTC重建图像');

[PSNR1, cr1] = Para(OI, rebuildImg1, 4)
[PSNR2, cr2] = Para(OI, rebuildImg2, 8)

function rebuildImg = BTC1(OI, N)
    % rebuildImg    重建图像
    % OI    原始图像
    % N    子块大小为 m = N * N
    m = N * N;
    OI = double(OI);
    [len, wid] = size(OI);
    
    % 判断len, wid是否能都被N整除
    if (len/N ~= round(len/N)) || (wid/N ~= round(wid/N))
        OI = Pad(OI, N);
        [len, wid] = size(OI);
    end
    
    rebuildImg = zeros(len, wid);
    for x = 1 : len/N
        for y = 1 : wid/N
            block = OI((x-1)*N+1 : (x*N), (y-1)*N+1 : (y*N));
            Xt = mean(mean(block));    % 计算均值
            q = 0;    % 计算q值: 比均值大的方块的个数
            for i = 1 : N
                for j = 1 : N
                    if block(i, j) >= Xt
                        q = q + 1;
                    end
                end
            end
             % 计算子块的标准差sigma
            sigma = sqrt(mean(mean(block .* block)) - Xt^2);
            
            if m == q
                a1 = Xt;
                a0 = Xt;
            else
                a0 = round(Xt - sigma * sqrt(q/(m-q)));
                a1 = round(Xt + sigma * sqrt((m-q)/q));
            end
            
            for i = 1 : N
                for j = 1 : N
                    if block(i, j) > Xt
                        block(i, j) = a1;
                    else
                        block(i, j) = a0;
                    end
                end
            end
            rebuildImg((x-1)*N+1 : (x*N), (y-1)*N+1 : (y*N)) = block(1:N, 1:N);
        end
    end
    rebuildImg = uint8(rebuildImg);
end

function rebuildImg = BTC2(OI, N)
    % rebuildImg    重建图像
    % OI    原始图像
    % N    子块大小为 m = N * N
    m = N * N;
    OI = double(OI);
    [len, wid] = size(OI);
    rebuildImg = zeros(len, wid);
    for x = 1 : len/N
        for y = 1 : wid/N
            block = OI((x-1)*N+1 : (x*N), (y-1)*N+1 : (y*N));
            Xt = mean(mean(block));    % 计算均值
            q = 0;    % 计算q值: 比均值大的方块的个数
            u_xi = 0;
            d_xi = 0;
            for i = 1 : N
                for j = 1 : N
                    if block(i, j) > Xt
                        q = q + 1;
                        u_xi = u_xi + block(i, j);
                    else
                        d_xi = d_xi + block(i, j);
                    end
                end
            end
            
            a0 = round(d_xi/(m-q));
            a1 = round(u_xi/(q));
            
            for i = 1 : N
                for j = 1 : N
                    if block(i, j) > Xt
                        block(i, j) = a1;
                    else
                        block(i, j) = a0;
                    end
                end
            end
            rebuildImg((x-1)*N+1 : (x*N), (y-1)*N+1 : (y*N)) = block(1:N, 1:N);
        end
    end
    rebuildImg = uint8(rebuildImg);
end

function [PSNR, cr]= Para(I1, I2, N)
% 计算重建图像的PSNR和压缩比
    P = 8;                %编码一个像素用多少二进制位
    max = 2^P - 1;          %图像有多少灰度级
    I1 = double(I1);
    I2 = double(I2);
    [len, wid] = size(I1);
    m = N * N;
    % 峰值信噪比
    MSE = sum(sum((I1-I2).^2)) / (len * wid);
    PSNR = 20 * log10(max/sqrt(MSE));
    % 压缩比
    cr = P / (1 + 2 * P / m);
end

% 若无法恰好分割,填充边缘
function newImg = Pad(OI, N)
    [len, wid] = size(OI);
    newImg(1:len,1:wid) = OI(1:len,1:wid);
    if mod(len, N) ~= 0
        padRow = N - mod(len, N);
        newImg(len+1:len+padRow) = OI(len-padRow:len);
    end
    if mod(wid, N) ~= 0
        padCol = N - mod(wid, N);
        newImg(wid+1:wid+1+padCol) = OI(wid-padCol:wid);
    end
end

实验结果

在这里插入图片描述

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值