2021年华中杯A题(马赛克瓷砖选色问题)详细分析

目录

一、基本介绍

1.1 题目描述

1.2 待解决问题

二、问题分析与求解

2.1 问题一分析与求解

 2.2 问题二分析与求解

 2.3 问题三分析与求解

三、完整代码

四、总结


一、基本介绍

1.1 题目描述

马赛克瓷砖是一种尺寸较小(常见规格为边长不超过 5cm)的正方形瓷砖,便于在非平整的表面铺设,并且容易拼接组合出各种文字或图案。但是受工艺和成本的限制,瓷砖的颜色只能是有限的几种。用户在拼接图案时,首先要根据原图中的颜色,选出颜色相近的瓷砖,才能进行拼接。

某马赛克瓷砖生产厂只能生产 22 种颜色(见附件 1)的马赛克瓷砖。该厂要开发一个软件,能够根据原始图片的颜色,自动找出颜色最接近的瓷砖,以减少客户人工选色的工作量。该厂希望你们团队提供确定原始颜色与瓷砖颜色对应关系的算法。假设原始图像为24位真彩色格式,即 R、G、B 三个颜色分量均为 8 位,共有28 × 28 × 28 = 16777216种颜色,对于任何一种指定的颜色,算法输出颜色最相近的瓷砖的颜色编号。

1.2 待解决问题

(1)附件 2 是图像 1 中的 216 种颜色,附件 3 是图像 2 中的 200 种颜色,请找出与每种颜色最接近的瓷砖颜色,将选出的瓷砖颜色的编号按照附件 4 的要求输出至结果文件。

2如果该厂技术革新,计划研发新颜色的瓷砖。那么,不考虑研发难度,只考虑到拼接图像的表现力,应该优先增加哪些颜色的瓷砖?当同时增加 1 种颜色、同时增加 2 种颜色、……、同时增加 10 种颜色时,分别给出对应颜色的RGB 编码值。

(3) 如果研发一种新颜色瓷砖的成本是相同的,与颜色本身无关,那么,综合考虑成本和表现效果,你们建议新增哪几种颜色,说明理由并给出对应的RGB 编码值。

现有瓷砖颜色

二、问题分析与求解

2.1 问题一分析与求解

针对问题一,我们首先引入了色差这一概念来表示不同颜色之间的相似度,并且将颜色对象坐标化,利用欧式距离公式,求得两点之间的距离值,并将此值赋予色差,通过计算得到色差值的大小来表示不同颜色之间的相似程度。并且,我们首先选择了 RGB 空间HSV 空间Lab 空间三种颜色空间,对三种不同颜色空间的特性进行了阐释,并且三种空间中均建立了各自的颜色匹配模型。之后,我们对三种空间以及各自所建立的模型进行评估比较,最终选定使用 Lab 空间模型以及根据该模型建立的颜色匹配模型,并在求解过程中进行简化运算,最终求得与附件 2、3 中 216 种颜色和 200 种颜色最接近的颜色,以及 RGB 编码值。

#HSV 的三维锥形图像代码
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from math import sin, cos, pi
#进行
# r,g,b [0,255]
# h 0 - 360
# s 0 - 100
# v 0 - 100
def rgb2hsv(r, g, b):r_, g_, b_ = r / 255, g / 255, b / 255c_max = max(r_, g_, b_)c_min = min(r_, g_, b_)dela = c_max - c_minif dela == 0:h = 0elif c_max == r_ and g_ >= b_:\h = 60 * ((g_ - b_) / dela + 0)elif c_max == r_ and g_ < b_:h = 60 * ((g_ - b_) / dela + 2)elif c_max == g_:h = 60 * ((b_ - r_) / dela + 2)else:h = 60 * ((r_ - g_) / dela + 4)s = 0 if c_max == 0 else dela / c_maxv = c_maxreturn h, s * 100, v * 100
# h 0,255 s,v 0,1
def hsv2rgb(h, s, v):c = v * sx = c * (1 - abs((h / 60) % 2-1))m = v - cif 0 <= h < 60:r_, g_, b_ = c, x, 0elif 60 <= h <= 120:r_, g_, b_ = x, c, 0elif 120 <= h <= 180:r_, g_, b_ = 0, c, xelif 180 <= h <= 240:r_, g_, b_ = 0, x, celif 240 <= h <= 300:r_, g_, b_ = x, 0, celif 300 <= h <= 360:r_, g_, b_ = c, 0, xreturn (r_ + m) * 255, (g_ + m) * 255, (b_ + m)
fig = plt.figure() # 定义新的三维坐标轴
ax = Axes3D(fig)
size = 30
points = np.linspace(0, 255, size).astype(np.int32)
for h in np.linspace(0, 360, size):for s in np.linspace(0, 100, size):for v in np.linspace(0, 100, size):if v < s:continuex_ = s * cos(h * pi / 180)y_ = s * sin(h * pi / 180)# z_ = -(v ** 2 - s ** 2) ** 0.5z_ = vx, y, z = hsv2rgb(h, s / 100, v / 100)ax.plot([x_], [y_], [z_], "ro", color=(x / 255, y / 255, z / 255, 1))
plt.show()
print('---')

import sys
import math
#本代码是针对题目来的,附件2是图像1中的216种颜色,附件3是图像2中的200种颜色。附件2的选色结果保存在result1.txt中。附件3的选色结果保存在result2.txt中。
filename1=sys.argv[1]#用来接收附件2
filename2=sys.argv[2]#附件3
filename3=sys.argv[3]#数据输出result1。txt
filename4=sys.argv[4]#数据输出result2。txt
f1=open(filename1,'r',encoding='utf8')#读入
f2=open(filename2,'r',encoding='utf8')#读入
f3=open(filename3,'w',encoding='utf8')#输出result1.txt
f4=open(filename4,'w',encoding='utf8')#输出result2.txt
s="序号,瓷砖颜色编号"+'\n'
f3.writelines(s)#先把格式输出
f4.writelines(s)
b=[[0,0,0],[255,255,255],[255,0,0],[246,232,9],[72,176,64],[27,115,186],[53,118,84],[244,181,208],[255,145,0],[177,125,85],[92,59,144],[11,222,222],[228,0,130],[255,218,32],[118,238,0],[17,168,226],[255,110,0],[201,202,202],[255,249,177],[179,226,242],[249,225,214],[186,149,195]]
def distance(a,b):#a是要被匹配的单个颜色,b为已有的颜色列表,返回最相似的颜色下标加1min=[442,0]#第一个参数为math.sqrt(3*(255)**2),第二个参数表示标号,是下标加1for i in range(len(b)):min_i=math.sqrt((a[0]-b[i][0])**2+(a[1]-b[i][1])**2+(a[2]-b[i][2])**2)if min_i<min[0]:min[0]=min_imin[1]=i+1return min
def str_int(s):#定义了一个可以把字符串“(a,b,c)”转化为一个整数型的listb = []for i in range(len(s)):if s[i] == '(':first=iif s[i] ==')':last=is1=s[first+1:last]s2=s1.split(',')for i in range(3):b.append(int(s2[i]))return b
lines1=f1.readlines()
lines2=f2.readlines()
for i in range(1,len(lines1)):#开始遍历附件2,第一行不要s=""#一个空字符串for j in range(len(lines1[i])):if lines1[i][j] ==',':#把','前的字符及序号s=lines1[i][:j]+','breaka=str_int(lines1[i])bianhao=distance(a,b)s=s+str(bianhao[1])+'\n'f3.writelines(s)
for i in range(1,len(lines2)):#开始遍历附件2,第一行不要s=""#一个空字符串for j in range(len(lines2[i])):if lines2[i][j] ==',':#把','前的字符及序号s=lines2[i][:j]+','breaka=str_int(lines2[i])bianhao=distance(a,b)s=s+str(bianhao[1])+'\n'f4.writelines(s)
f1.close()
f2.close()

 

 2.2 问题二分析与求解

针对问题二,由于只考虑表现力效果,我们首先对附件 2、3 中的 216 种颜色 200 种颜色和已有的 22 种进行了统计可视化处理,得出它们的颜色空间分布图,以此为基础选定需求侧与供给侧的分析入手角度,确定了表现力评估标准——“在添加颜色后,新的颜色集在空间中的分布更加均匀”。根据上述条件,优先增加与多个颜色差别较小,不管增加几种颜色,但本质上还是选近似颜色,只不过同时多增加几种颜色就要考虑新聚类中心的分布问题,FCM思想比较适合解决该问题,目标函数可以就以FCM的来 。

其中i表示聚类中心,j表示其他点,c为聚类中心总数,N为其他点总数(除了FCM也可以借助其他聚类算法的思想来做),该算法思想就是其他点到聚类中心的距离的倒数之和最小,但是别直接套用该算法程序,其中的距离公式需要更改。第二问说是从技术革新的角度,那么本问被聚类的点应当为256*256*256个点了,并不是附件2和附件3的点来做聚类分析,当然在选出新聚类中心颜色后,可以再去算一附件2和附件3的J函数值,对于题目提到的表现力,颜色越近似就说明表现力越好,表现力函数公式可以直接是J函数的倒数。

%MATLAB部分代码
%下面程序是简易版粒子群优化算法,种群大小和迭代次数设的比较小,自行调整,也可换做其他优化算法
num=20;%种群大小
k=2;%新增k个中心
c1 = 0.5; %非负常数,加速度因子
Vmax=10; %粒子最大更新速度
Vmin=-10; %粒子最小更新速度
%初始化种群
xx=[];for i=1:numxx(i,:)=round(255.*rand(1,3*k));%round四舍五入
endF=[];
for i=1:numYY=[];YY=[Y;reshape(xx(i,:)',3,k)'];%将新聚类中心添加到瓷砖颜色库中D=[];D=Dis(X,YY,a1,a2);D=1./D;D(find(D==Inf))=0;D=sum(D,2);D=1./D;F(i,1)=sum(D);
end
[bestf,in]=min(F);
bestx=xx(in,:);
trace(1)=bestf;
det=20;%迭代次数
slexx=xx;
for ii=1:detV=rands(num,k*3);for j=1:numV(j,:)=V(j,:)+c1*rand.*(bestx-slexx(j,:));endV(find(V>Vmax))=Vmax;V(find(V<Vmin))=Vmin;slexx=slexx+V;slexx=round(slexx);slexx(find(slexx>255))=255;slexx(find(slexx<0))=0;FF=[];for i=1:numYY=[];YY=[Y;reshape(slexx(i,:)',3,k)'];%将新聚类中心添加到瓷砖颜色库中D=[];D=Dis(X,YY,a1,a2);D=1./D;D(find(D==Inf))=0;D=sum(D,2);D=1./D;FF(i,1)=sum(D);endif min(FF)<bestf[bestf,in]=min(FF);bestx=slexx(in,:);endtrace=[trace;bestf];
end

 2.3 问题三分析与求解

第三问,在上一问基础上考虑成本,成本函数就按新增了多少个颜色来算,相当于说本问寻优的自变量个数m是变化的,可以在上述步骤增加一个目标函数M,即新增m个颜色。本问即是多目标寻优问题。针对问题三,在本题中,除却考虑拼接图像的表现外,研发成本也成为了在优化问题中的一个重要考虑对象。针对表现力问题,我们考虑了新聚类中心在空间中的分布,并且利用了 FCM 思想,给定了表现力函数;而成本问题,由于研发任意一中新颜色的成本相同,且与颜色本身无关,因此我们把研发成本与颜色数量认定为线性关系,并建立其成本函数。据以上所述,我们建立起以增加数目为变化的决策变量,以表现力函数和成本函数共同为目标函数的多目标优化模型,并利用了非支配排序算法模拟退火算法,对模型进行求解。

%MATLAB自建函数
function D=distance(X,Y,a1,a2) s=std(X-Y); d=sqrt(sum((X-Y).^2)); D=s*a1+d*a2; 
end function [TT,chrom]=ns2(NN,F1,F2) a = 0; T1 = []; T2 = []; chrom=NN; chrom1 = []; chrom2 = []; while a == 0 M = []; for i = 1:length(F1) M(i,1) = length(find(F1<F1(i,1)))+length(find(F2<F2(i,1))); end b1 = []; b2 = []; [b1,b2] = sort(M); if length(chrom)>0 && b1(1) == 0 T1 = [T1;F1(b2(1)),F2(b2(1))]; chrom1 = [chrom1;chrom(b2(1),:)]; F1(b2(1)) = []; F2(b2(1)) = []; chrom(b2(1),:) = []; else a = 1; T2 = [F1,F2]; chrom2 = chrom;end end T2 = T2(b2,:); chrom2 = chrom2(b2,:); if size(T1,1) > 2 y = yongji(T1);%拥挤度 for i = 2:size(T1,1) if y(i-1) > y(i) T1(i-1:1:i,:) = T1(i:-1:i-1,:); chrom1(i-1:1:i,:) = chrom1(i:-1:i-1,:); endendendif length(T2) > 0y = yongji(T2);%拥挤度 for i = 2:size(T2,1) if b1(i) == b1(i-1) if y(i-1) > y(i) T2(i-1:1:i,:) = T2(i:-1:i-1,:); chrom2(i-1:1:i,:) = chrom2(i:-1:i-1,:); endendendendTT = [T1;T2];chrom = [chrom1;chrom2]; 
end 
function y=yongji(H) y1=H(:,1); y2=H(:,2); [yy1,a1]=sort(y1); [yy2,a2]=sort(y2); L=[]; L=[1 1]; for i=2:length(yy1)-1 L=[L;(yy1(i+1,1)-yy1(i-1,1))/(max(yy1)-min(yy1)),(yy2(i+1,1)-yy2(i-1,1))/(max(yy2) 32-min(yy2))]; end L=[L;1 1]; L=[L(a1,1),L(a2,2)]; y=sum(L,2); 
end 
function D=Dis(X,Y,a1,a2) D=[]; for i=1:size(X,1) for j=1:size(Y,1) D(i,j)=distance(X(i,:),Y(j,:),a1,a2); endend
end

三、完整代码

2021年华中杯A题(马赛克瓷砖问题)可运行代码.zip_华中杯数学建模2021a题代码

四、总结

数学建模的趣味就是几乎没有正确答案,解法多种多样,没有绝对的好方法,只要自己用着舒服就OK,上述是我对于这道题的一些粗浅的看法,可能有一些忽略的因素,欢迎各位巨佬指点。

在学习中成功、在学习中进步!我们一起学习不放弃~

记得三连哦~ 你们的支持是我最大的动力!!欢迎大家阅读往期文章哈~

小编联系方式如下,欢迎各位巨佬沟通交流,代码什么的加小编私聊哦~

int[] arr=new int[]{4,8,3,2,6,5,1};
int[] index= new int[]{6,4,5,0,3,0,2,6,3,1};
String QQ = "";for (int i : index){QQ +=arr[i];
}
System.out.println("小编的QQ:" + QQ);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机无法连接无线信号,win7系统连接无线信号时提示Windows无法连接到路由器名称的四种解决方法...

现如今网络发展速度非常快&#xff0c;无线网络已经普及了&#xff0c;使用率高了遇到的问题也就多了。比如有时候笔记本win7系统连接无线信号时出现“Windows无法连接到路由器名称”(如下图所示)&#xff0c;该如何解决此问题呢&#xff1f;下面脚本之家的小编介绍几种解决方法…

数据采集与清洗基础习题(四)Pandas初体验,头歌参考答案

数据采集习题参考答案&#xff0c;会持续更新&#xff0c;点个关注防丢失。 创作不易&#xff0c;一键三连给博主一个支持呗。 为了方便查找&#xff0c;已按照头歌重新排版&#xff0c;朋友们按照头歌所属门类查找实训哦&#xff0c;该篇为Pandas。 文章目录 实训一&#…

全国计算机准考证打印2015年,甘肃2015下半年全国计算机等级考试准考证打印时间...

甘肃2015下半年全国计算机等级考试准考证打印时间一、打印准考证考生可在考前2周之内登陆全省统一报名网站自主打印准考证&#xff0c;或到考点现场领取准考证。二、考试时间下半年&#xff1a;2015年9月19日至21日&#xff0c;分批进行。考试具体时间、地点均以“准考证”为准…

TOPSIS与模糊Borda 的组合应用(以第二届大湾区杯和国赛为案例)

目录 一、TOPSIS&#xff08;优劣解距离法&#xff09;简介 二、TOPSIS&#xff08;优劣解距离法&#xff09;主要步骤 &#xff08;1&#xff09;数据进行标准化 &#xff08;2&#xff09;构建决策矩阵 &#xff08;3&#xff09;构造加权规范阵 &#xff08;4&#xf…

Spring Boot 页面国际化

internationalization详解 国际化&#xff08;internationalization&#xff09;是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言&#xff0c;国家/地区和文化相关的元素。换言之&#xff0c;应用程序的功能和代码设计考虑在不同地区运行的…

唯美计算机语言,唯美精辟的语句

1、当泪水一滴滴的掉落在我的手上&#xff0c;那时竟想为何我非你不可&#xff01;2、原来再美好的承诺&#xff0c;最终还是会被现实打败。3、明明不是陌生人&#xff0c;却装的&#xff0c;比陌生人&#xff0c;还要陌生。4、如果我是个瘦子&#xff0c;伤心时我还可以数数排…

不到30的成本,还不赶紧造起来——盘点软著申请小知识

今年上半年的时候跟着老师做项目&#xff0c;为了学习应付中期报告&#xff0c;就自己写了一个小软件&#xff0c;然后申请了一个软著&#xff0c;至于为啥要头铁的自己上呢&#xff0c;因为想要拿独立著作权&#xff0c;那当然是没有报销的啦~&#xff0c;这里有同学就要问啦&…

Linux系统安装及配置——Centos-7-X86_64-DVD-2009

目录 1.下载 VMware Workstation软件 2.下载 Centos-7-X86_64-DVD-2009.iso 3.安装并配置 3.1打开VMware Workstation&#xff0c;选择创建新的虚拟机 3.2选择自定义&#xff0c;然后下一步 3.3下一步 3.4选择稍后安装操作系统&#xff0c;然后下一步 3.5选择Linux&am…

2018年12月份计算机,CPU天梯图2018年12月最新版 十二月台式电脑CPU性能排行

Helio&#xff0c;大家好&#xff0c;11月再见12月你好&#xff01;欢迎关注IT数码通带来的最新一期桌面CPU天梯图。距离上一次天梯图更新已经过去一个月时间了&#xff0c;伴随着12月份到来&#xff0c;新的天梯图需要进行更新和完善了。接下来“IT数码通”小编为大家带来了CP…

C语言程序的错误和警告

一段C语言代码&#xff0c;在编译、链接和运行的各个阶段都可能会出现问题。编译器只能检查编译和链接阶段出现的问题&#xff0c;而可执行程序已经脱离了编译器&#xff0c;运行阶段出现问题编译器是无能为力的。 如果我们编写的代码正确&#xff0c;运行时会提示没有错误&am…

计算机的集成显卡是什么意思,IGD、PEG、PCI的含义,我的电脑是集成显卡该选哪一项...

请详细介绍IGD&#xff0c;PEG&#xff0c;PCI的含义&#xff0c;我应该为计算机的集成显卡选择其中的一种。 ...请详细说明IGD&#xff0c;PEG&#xff0c;PCI的含义&#xff0c;如果我的计算机是集成显卡&#xff0c;则应该选择IGD&#xff0c;PEG&#xff0c;PCI的含义。展开…

Spring Boot 数据国际化

internationalization详解 国际化&#xff08;internationalization&#xff09;是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言&#xff0c;国家/地区和文化相关的元素。换言之&#xff0c;应用程序的功能和代码设计考虑在不同地区运行的…

没有bug队——加贝——Python 练习实例 21,22

21.题目&#xff1a; 猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时&…

没有bug队——加贝——Python 练习实例 23,24

23.题目&#xff1a;打印菱形 程序分析&#xff1a;先把图形分成两部分来看待&#xff0c;前四行一个规律&#xff0c;后三行一个规律&#xff0c;利用双重for循环&#xff0c;第一层控制行&#xff0c;第二层控制列。 注&#xff1a;将这个图形看成对称的&#xff0c;前面和后…

Spring Boot 之 itext导出pdf下载

Java操作pdf框架详解 itext是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本&#xff0c;表格&#xff0c;图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。 下载效果演示 po…

从您的计算机移除此产品,解决office提示“此操作只对目前安装的产品有效”的方法...

Office软件是我们所有微软系统预装版本中都会有的一个组件&#xff0c;有的用户在购买电脑之后由于不想使用这个软件等种种原因会选择将这个软件从电脑中卸载。卸载的方法有很多&#xff0c;我们常用的方法就是使用电脑中自带的卸载软件卸载这个程序&#xff0c;还有一种就是使…

没有bug队——加贝——Python 练习实例 25,26

我非常认真的告诉大家今天这是一篇水文&#xff0c;别看了 25.题目&#xff1a; 求12!3!...20!的和。 程序分析&#xff1a;此程序只是把累加变成了累乘。 s 0 l range(1,21) def op(x):r 1for i in range(1,x 1):r * ireturn r s sum(map(op,l)) print (1! 2! 3! …

符江职高计算机教什么,高县符江职高具体地址

摘要&#xff1a;学校地址 :宜宾市高县清福镇学府路22号 公交路线 高县:进入盛兴路&#xff0c;行驶300米-左转&#xff0c;进入朔村路&#xff0c;行驶540米-左转&#xff0c;进入汉胜路&#xff0c;行驶440米-请直走&#xff0c;进入富悦路&#xff0c;行驶200米-请直走&…

MATLAB基础教程(7)——求解定积分和不定积分

目录 定积分的基本概念 什么是定积分&#xff1f; 如何深入的理解定积分&#xff1f; 如何计算定积分? 在matlab中计算定积分。 不定积分 在matlab中计算不定积分 在matlab中计算定积分 本期回顾 定积分的基本概念 什么是定积分&#xff1f; 简而言之&#xff0c;我…

微信公众号中选择时间css,微信公众号到底应该几点推文?

原标题&#xff1a;微信公众号到底应该几点推文&#xff1f;微信公众号到底应该几点推文&#xff1f;早晨上班&#xff0c;中午休息&#xff0c;晚上睡觉前&#xff0c;都是好时间。这些时间别说刚入行的小白知道&#xff0c;就连半只脚没踏进运营门槛的小灰都知道&#xff0c;…