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

这里主要用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

clc

N=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

end

XLAB=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:N

plot3(data1(IND1==j,1),data1(IND1==j,2),data1(IND1==j,3),'LineStyle','none','Marker','.','MarkerSize',12,'MarkerEdgeColor',map(j,:));

end

view(3)

hold off

figure%绘制连线图

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-1

potA=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

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

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

    利用几种颜色量化方法提取图片颜色色调 利用几种颜色量化方法提取图片颜色色调 1 k-means方法(在RGB空间) 2 k-means方法(Lab颜色空间) 3 最小方差量化方法rgb2ind() 4 ...

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

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

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

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

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

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

  5. matlab 图像矢量量化,MATLAB环境下基于矢量量化的说话人识别系统(1)

    第21卷第6期湖 北 工 业 大 学 学 报2006年12月 Vol.21No.6 Journal of Hubei Univer sity of Technology Dec.2006 [收稿日期] ...

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

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

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

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

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

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

  9. 给图片加颜色边框怎么弄,3种好用方法

    给图片加颜色边框怎么弄?图片是我们每个人平时都必不可少的文件之一,尤其是在工作中的使用,不同的使用场景对于图片的要求也是不一样的,这就要求我们具有一定的图片处理技能,现在任何事情都离不开电脑,所以学会 ...

最新文章

  1. C++ 函数的模板的使用
  2. php设置at定时,laravel定时任务
  3. WatiN-Html元素的操作
  4. 最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇
  5. python使用kafka原理详解真实完整版_史上最详细Kafka原理总结
  6. 什么是服务网格(Service Mesh)
  7. linux查看命令本身shell脚本的路径
  8. 如何编制试算平衡表_试算平衡表的编制
  9. NYOJ水题--最短街区问题
  10. python-enurmate
  11. iOS扫码识别之后添加震动/播放声音提示、歌词解析并随音乐滚动显示(包含demo源码)
  12. 计算机系统常见故障及处理,电脑常见故障以及解决方案都在这里
  13. Ubuntu17.04解决博通网卡问题
  14. golang 生成二维码名片 海报
  15. matlab泊松分布随机数和图像,基于Matlab的Poisson分布随机数的Monte carlo模拟
  16. phpadmin安装到mysql中,mysql 和phpadmin安装
  17. 实现正负值及多条Y轴 Echarts柱状图
  18. linux proc 文件系统下 entry 的解释(转)
  19. 2020-08-26
  20. JSJ——java基本概念二

热门文章

  1. HDU 1373(Channel Allocation)
  2. 【计网第一章 概述】
  3. 小米Note 3获取root超级权限的流程
  4. 深度学习attention原理_深度学习系列——attention机制与应用
  5. PHPCMS V9双语站建设切换
  6. 转录组分析流程|TransDecoder预测转录本的开放阅读框(二)
  7. 记录一次日志采集工具fluentd踩坑
  8. 【压缩】关于tar、gzip/gunzip、bzip2/bunzip2、xz和zcat
  9. 大数据平台搭建,cdh选型配置
  10. axios.get php,vue + axios get下载文件功能