利用几种颜色量化方法提取图片颜色色调

  • 利用几种颜色量化方法提取图片颜色色调
    • 1 k-means方法(在RGB空间)
    • 2 k-means方法(Lab颜色空间)
    • 3 最小方差量化方法rgb2ind()
    • 4 其余名画
    • 5 代码

利用几种颜色量化方法提取图片颜色色调

这里主要用3种方法:包含两种k-means方法和一种matlab自带的最小方差量化方法。
为了方便对比,文中选用梵高的星空(The Starry Night)作为提取图片。

1 k-means方法(在RGB空间)

颜色量化是指一个减少在图像中的颜色数量的压缩过程。旨在用尽可能少的颜色去还原图片。
所以,也可以用聚类方法去进行处理,即将所有颜色在色彩空间上分布开,然后为每个集群选择所代表的点来创建调色板。

比如梵高的星空:

把所有像素点的颜色在RGB空间显示出来,可以得到:

这时我们再利用k-means聚类算法把调色板设为4种颜色,即N=4,
得到像素的局聚类表示为

质心颜色的连线图如下:

得到的N=4下的图片为

可以看到有较大的偏差。
当取N=20时,得到的图为:

颜色质量要比只用4个颜色的要高出很多。

而在颜色板的分布这张图上,也可以比较明显的看到梵高在做这幅画时使用的主要3种颜色,和wiki百科中提到的ultramarine 、cobalt blue 和indian yellow比较吻合。

2 k-means方法(Lab颜色空间)

事实上,在相同的方法,采用不同的颜色空间进行聚类,可以发现影响最主要的还是数量的选取。可能有些情况下Lab或者HSV方法比RGB看上去更好,但是影响也不是很大。

下图是利用LAB颜色空间进行聚类分析的结果,N=4,并且为了方便对比,将结果依然显示在RGB的坐标系内。

可以看到结果和第一节的相似。

当N=20的时候,观察和第一节的区别,发现只是在一些细节上划分区域有所差别,基本效果很接近。

3 最小方差量化方法rgb2ind()

matlab中有专门的函数用来进行色彩量化,为rgb2ind(),采用的方法为最小方差量化方法。具体可以参见:
https://ww2.mathworks.cn/help/matlab/ref/rgb2ind.html
这里依然取N=4和N=20进行对比。

可以看到用matlab自带的方法要比kmeans方法更好。

4 其余名画

5 代码

K-Means算法用的是matlab里自带的kmeans函数,可以参见:
http://www.mathworks.com/help/stats/kmeans.html
颜色板分布画的连接图用的算法来源于 Python 平面上的点的最短连线网 这篇文章:
https://blog.csdn.net/lnotime/article/details/82313355
LAB和RGB之间的转换用的是 色彩空间Lab和RGB互转的Matlab代码 这篇文章:
https://blog.csdn.net/wendy260310/article/details/17100497

这里由于篇幅,我就只粘贴Kmeans-LAB算法的程序和rgb2ind程序。

clear
clcN=20;%设置聚类数目
data = imread('xingkong.JPEG');
dataLAB=single(zeros(size(data)));
[dataLAB(:,:,1),dataLAB(:,:,2),dataLAB(:,:,3)] = RGB2Lab(data(:,:,1),data(:,:,2),data(:,:,3));
hs=size(data);
data2=zeros(hs(1)*hs(2),3);
ii=0;
for j=1:hs(1)for k=1:hs(2)ii=ii+1;data2(ii,:)=dataLAB(j,k,:);end
endXLAB=single(data2);[idx,CLAB] = kmeans(XLAB,N,'Distance','cityblock','Replicates',5);
C=zeros(size(CLAB));
X=zeros(size(XLAB));
[C(:,1),C(:,2),C(:,3)]=Lab2RGB(CLAB(:,1),CLAB(:,2),CLAB(:,3));
[X(:,1),X(:,2),X(:,3)]=Lab2RGB(XLAB(:,1),XLAB(:,2),XLAB(:,3));
X=X*256;
C=C*256;figure%原图
set(gcf,'unit','centimeters','position',[10,10,8,7])
image(data);
%三维绘图
figure
set(gcf,'unit','centimeters','position',[10,10,8,7])
hold on
%'MarkerFaceColor'
for j=1:N%plot(X(idx==j,1),X(idx==j,2),'LineStyle','none','Marker','.','MarkerSize',12)plot3(X(idx==j,1),X(idx==j,2),X(idx==j,3),'LineStyle','none','Marker','.','MarkerSize',12,'MarkerFaceColor',C(j,:)/256,'MarkerEdgeColor',C(j,:)/256);
end
%plot3(C(:,1),C(:,2),C(:,3),'kx','MarkerSize',15,'LineWidth',3)
view(3)
hold off%然后输出这几个基准色对应的图
data2_2=single(data2);j=1:length(idx);
data2_2(j,:)=C(idx(j),:);ii=0;
for j=1:hs(1)for k=1:hs(2)ii=ii+1;data(j,k,:)=data2_2(ii,:);end
end
figure%新图
set(gcf,'unit','centimeters','position',[10,10,8,7])
image(data);figure%点线图
set(gcf,'unit','centimeters','position',[10,10,8,7])
paths=find_min_length_3D(C);%参见:平面上的点的最短连线网
hold on
for j=1:size(paths,1)plot3(paths(j,[1,4]),paths(j,[2,5]),paths(j,[3,6]),'b-')plot3(C(j,1),C(j,2),C(j,3),'LineStyle','none','Marker','.','MarkerSize',40,'MarkerFaceColor',C(j,:)/256,'MarkerEdgeColor',C(j,:)/256)
end
plot3(C(j+1,1),C(j+1,2),C(j+1,3),'LineStyle','none','Marker','.','MarkerSize',40,'MarkerFaceColor',C(j,:)/256,'MarkerEdgeColor',C(j+1,:)/256)
hold off
view(3)

rgb2ind程序

clear
N=20;
%设置图像位数
RGB = imread('Stacks of wheat.jpg');
figure
set(gcf,'unit','centimeters','position',[10,10,8,7])
imagesc(RGB)[IND,map] = rgb2ind(RGB,N);
IND=IND+1;
figure
set(gcf,'unit','centimeters','position',[10,10,8,7])
imagesc(IND)
colormap(map)%三维绘图
hs=size(RGB);
data1=reshape(RGB,hs(1)*hs(2),3);
IND1=reshape(IND,hs(1)*hs(2),1);figure
set(gcf,'unit','centimeters','position',[10,10,8,7])
hold on
for j=1:Nplot3(data1(IND1==j,1),data1(IND1==j,2),data1(IND1==j,3),'LineStyle','none','Marker','.','MarkerSize',12,'MarkerEdgeColor',map(j,:));
end
view(3)
hold offfigure%绘制连线图
set(gcf,'unit','centimeters','position',[10,10,8,7])
paths=find_min_length_3D(map);
hold on
for j=1:size(paths,1)plot3(paths(j,[1,4]),paths(j,[2,5]),paths(j,[3,6]),'b-')plot3(map(j,1),map(j,2),map(j,3),'LineStyle','none','Marker','.','MarkerSize',40,'MarkerEdgeColor',map(j,:))
end
plot3(map(j+1,1),map(j+1,2),map(j+1,3),'LineStyle','none','Marker','.','MarkerSize',40,'MarkerEdgeColor',map(j+1,:))hold off
view(3)

find_min_length_3D函数

function paths=find_min_length_3D(pots)
%输入单,返回最短连接网格
%pots满足N行3列的格式N=size(pots,1);
%初始化
con=pots(1,:);%已经连线的点集,先随便放一个点进去
Ncon=pots(2:end,:);%还没连线的点集
paths=zeros(N-1,6);%所有连线length_total=0;%总长度
%循环
for j=1:N-1potA=con(1,:);potB=Ncon(1,:);lengthAB=sum((potA-potB).^2);for m=1:size(con,1)for n=1:size(Ncon,1)lengthAB_temp=sum((con(m,:)-Ncon(n,:)).^2);if lengthAB_temp<lengthABlengthAB=lengthAB_temp;%如果新线段更短,则采用新的线段potA=con(m,:);potB=Ncon(n,:);endendendpaths(j,:)=[potA,potB];con=[con;potB];Ncon(sum(Ncon==potB,2)==3,:)=[];%这里3D所以是3length_total=length_total+lengthAB;
end
end

利用几种颜色量化方法提取图片颜色色调相关推荐

  1. 颜色量化 matlab,利用几种颜色量化方法提取图片颜色色调

    利用几种颜色量化方法提取图片颜色色调 这里主要用3种方法:包含两种k-means方法和一种matlab自带的最小方差量化方法. 为了方便对比,文中选用梵高的星空(The Starry Night)作为 ...

  2. 计算机中图像的颜色,详解在电脑中实现提取图片颜色的操作的几种技巧

    我们在很多的电脑的软件对于图片的使用中,是有很多的软件可以实现设计的,那在不同的工具中有需要使用到的一些颜色的提取的就是我们需要使用到的不同的问题,怎么在看到图片以后就实现提取图片颜色的呢,今天小编就 ...

  3. 16进制颜色透明_PPT | 如何快速提取图片颜色之人生太卷

    01 2020 真的是猝不及防 推文已有四月未更新,作为一个超级硬核,不出家,不还俗简称单身的男人,真正从行动上且精神上践行了下图的名言. 奈何自身修为还不够咸鲜,偶尔登录公共号,越发感觉以前特别鲜红 ...

  4. Gradify - 提取图片颜色,创建响应式的 CSS渐变

    被请求的HTTP对象之间的延迟会有一个时间段,这个期间网页看起来不完整.Gradify 可以分析出图像中4个最常见的颜色,创建一个梯度(或纯色)作为图片占位符.Gradify 可以在在任何图像发现最突 ...

  5. html如何提取图片颜色代码,PS怎么提取颜色做色卡?

    PS怎么提取颜色做色卡? 方法1: 打开PS软件,直接拖动要制作成色卡的图片到窗口,然后选择上方编辑栏的[滤镜]--[像素化]--[马赛克],如图: 单元格数字大小随意自己掌控,数字越小,得到的颜色越 ...

  6. 用python提取图片主要颜色_Python可视化|09-使用python和R提取图片颜色绘图(五-颜色使用完结篇)...

    本文是继前面四篇python可视化颜色使用的完结篇,介绍如何使用python提取图片中的颜色绘图: 如果你不想使用前人设定好的色号或者colormap,想自己从好看的图片中提取颜色,请往下看: 1.颜 ...

  7. 怎么用ps提取图片颜色分析色彩搭配

    这个小工具(PS插件)还是挺好用的,无需网络,直接在PS软件上面即可使用,支持Win与MAC版PS CS6以上版本,再也不用为分析图片配色发愁了,这个PS脚本插件可以搜一下"图片颜色分析识别 ...

  8. php生成图片颜色失真,Coreldraw导出图片颜色失真怎么办?

    CorelDRAW用来画矢量图是很好用的了,不过你会发现你导入ps或者ai制作的图片时,颜色会偏差很多,这是因为CorelDRAW的颜色模式是CKMY的原因.不过你简单的把CKMY模式改成RGB模式, ...

  9. React组件: 提取图片颜色

    当你需要根据不同图片显示不同的边框色或背景色时,你可以使用React-Color-Thief, 它会告诉你这张图片有哪些颜色,并按颜色比重返回RGB值给你. ?体验一下 如何使用 const colo ...

最新文章

  1. [自带避雷针]DropShadowEffect导致内存暴涨
  2. 你需要XXX的权限对此文件(此文件夹进行)修改
  3. linux后台运行命令,nohup
  4. 前端javascripts基础知识点猴子吃桃
  5. 我的高中生涯大概只有一年半学的是C/C++
  6. 推荐一个非常好玩的falsh游戏
  7. python查函数用法语句_Python-17 (函数的基本使用)
  8. Redis从入门到精通:中级篇
  9. 【渗透测试】Sunlogin-RCE(向日葵)
  10. java遍历对象的属性_Java遍历对象所有属性
  11. 【PHP基础】实现PHP与SQL数据库的连接
  12. 『TensorFlow』TFR数据预处理探究以及框架搭建
  13. Unity-黑暗之魂复刻-手柄接入与配置(Joystick)
  14. C++ 强制类型转换:static_cast、dynamic_cast、const_cast 和 reinterpret_cast
  15. 导图解书-经典(04)断舍离
  16. 计算机组成原理算术逻辑单元设计,计算机组成原理:带进位算术逻辑运算单元ALU设计实验.doc...
  17. 十几年前跟QQ、MSN平起平坐的雅虎通要关闭了
  18. 商品规格表设计_超市商品配置表的管理
  19. 拿下宝马中国量产订单的四维图新,如何在自动驾驶地图领域内外兼修?...
  20. Unity中实现刀光剑影的方法之---拖尾asset store 插件-Melee Weapon Trails

热门文章

  1. linux開啟虛擬機命令,Linux系统入门之虚拟机与常用指令学习
  2. 微信小程序学习记录——3.框架-逻辑层
  3. 工控机防病毒该如何进行
  4. ❤️用一万字给小白全面讲解python编程基础问答❤️《记得收藏不然看着看着就不见了》
  5. T100自定义应用使用说明(azzi650)
  6. linux ps faux,PS在线版fauxto为照片添加暗底边框
  7. 去掉Android开机无SIM卡提示框
  8. 喜欢的旋律,喜欢的歌曲-《收敛》
  9. Emenasa部署UR10e机器人实现汽车零件进行塑料定量的自动化
  10. eja智能压力变送器工作原理_EJA智能变送器分解.ppt