颜色量化是指减少在图像中的颜色数量的压缩过程,是一种对彩色图像进行数字图形处理的常用方法。其核心内容是在尽量减少初始彩色图像失真的前提下,能够将颜色丰富的原始彩色图像映射至颜色种类较少的量化图像上的过程。
先在图像颜色空间里随机选取K种颜色,利用这K种颜色生成一个初始的调色板,再根据颜色距离的就近原则,将彩色图像中的每个像素都映射到初始生成的调色板中去,从而形成K种聚类,最后得到每一类像素颜色的均值,再根据这些均值来生成新的调色板。不断重复这一过程,直至颜色板中的颜色不再变化时终止算法。
clear; clc; close all; loli=imread('lenna.jpg'); %读取彩色图像 [x,y,channel]=size(loli); %原图片为彩色图像,loli为x*y*3的数组 loli_vec=reshape(loli,x*y,channel); %将loli返回到一个[x*y,3]的loli_vec数组 figure for i = 1:4 K=2^i; %颜色板K种颜色 [~,cls]=k_means(double(loli_vec),[],K,[]); %实行K-means centers=zeros(K,channel); for k=1:K centers(k,:)=mean(loli_vec(cls==k,:)); %求每一类像素颜色均值 end centers=uint8(centers); %将双精度浮点数组改为8位无符号整数,减小占存 loli_vec_zip=centers(cls,:); loli_zip=reshape(loli_vec_zip,x,y,channel); subplot(1,4,i) imshow(loli_zip) imwrite(loli_zip,['loli_zip_' num2str(i) '.jpg']) disp(['loli_zip_',num2str(i),'.jpg has saved.']) end