3-3.Image Quantization

 




量化步長(Delta)
X代表要被量化的訊號,N是量化級別的數量。
原始信號的最大值和最小值要先計算出來,也就是一整張影像(矩陣中最大及最小的值)


均勻量化(uniformly quantize):把輸入信號的取值域等間隔分割的量化稱為均勻量化
輸入陣列X(向量或矩陣)到 N 個離散等級。



使用此函數來量化:
指定影像為 7 b/pel、6、5、4、3、2、1 b/pel(bits per pixel)

程式碼

>> y=imread('fountainbw.tif');
>> image(y);
>> colormap(gray(256));
>> axis('image');
>> z=double(y);
>> max_val = max(z(:));
>> min_val = min(z(:));
>> N=2^7;
>> delta = (max_val - min_val) / (N-1);
>> quantiz_image7 = round((z-min_val) / delta) * delta + min_val;
>> image(quantiz_image7);
>> colormap(gray(256));
>> axis('image');

設定量化級數N為2的7次方代表每一個像素占用7bit
執行量化操作:從每個像素值中減去 Min(X)再去除以delta。四捨五入到最接近的整數,再乘以量化步長,最後加回最小值。





將N重構為function傳參版本


getavg函數程式
最終程式
function quantize_and_save_image(image_filename, bits_per_pixel)
    % 讀取並顯示原始圖像
    y = imread(image_filename);
    figure;
    image(y);
    colormap(gray(256));
    axis('image');
    title('Original Image');
    
    % 轉換圖像數據類型為雙精度
    z = double(y);
    
    % 計算量化參數
    max_val = max(z(:));
    min_val = min(z(:));
    N = 2^bits_per_pixel;
    delta = (max_val - min_val) / (N - 1);
    
    % 執行量化
    quantized_image = round((z - min_val) / delta) * delta + min_val;
    
    % 顯示量化後的圖像
    figure;
    image(quantized_image);
    colormap(gray(256));
    axis('image');
    title(['Quantized Image - ', num2str(bits_per_pixel), ' bits/pixel']);
    
    % 儲存量化後的圖像
    save_filename = [num2str(bits_per_pixel), '_bits_per_pixel.jpg'];
    imwrite(uint8(quantized_image), save_filename, 'jpg');
end

效果




接著就是function call傳入不同參數達成所要的不同結果存取。
這邊是quantize_and_save_image 函數定義在一個名為 Uquant.m 的檔案中,主程式中需要使用 Uquant 來呼叫這個函數,當然也可以都改成同樣名稱。
















留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header