第十三届“华中杯”大学生数学建模挑战赛题目 A 题 马赛克瓷砖选色问题

该博客详细介绍了第十三届“华中杯”大学生数学建模挑战赛A题的解决方案,涉及使用Python进行颜色匹配。作者提出通过计算RGB值之间的距离来判断瓷砖颜色的相似度,并给出了算法构思和实现,包括选择最接近的颜色、建议增加的新颜色以及成本与效果的最佳平衡策略。
摘要由CSDN通过智能技术生成

第十三届“华中杯”大学生数学建模挑战赛题目 A 题 马赛克瓷砖选色问题,要求1,2,3用python完成


前言

问题阐述:
要根据原图中的颜色,选出颜色相近的瓷砖。
提供我们的颜色有:
在这里插入图片描述
要求1:
附件2是图像1中的216种颜色,附件3是图像2中的200种颜色,请找出与每 种颜色最接近的瓷砖颜色,将选出的瓷砖颜色的编号按照附件4的要求输出至结果 文件。
要求2:
如果该厂技术革新,计划研发新颜色的瓷砖。那么,不考虑研发难度,只考虑到拼接图像的表现力,应该优先增加哪些颜色的瓷砖?当同时增加1种颜色、 同时增加2种颜色、……、同时增加10种颜色时,分别给出对应颜色的RGB编码 值。
要求3:
如果研发一种新颜色瓷砖的成本是相同的,与颜色本身无关,那么,综合考 虑成本和表现效果,你们建议新增哪几种颜色,说明理由并给出对应的 RGB 编码值。
我们先了解了解下RGB
在这里插入图片描述
可以看到R、G、B 三个颜色分量均为 8 位.
我们可以通过距离来判断相似度(最容易实现的算法)
假设:

#像素点
a=(Ra,Ga,Ba)
#像素点
b=(Rb,Gb,Bb)
L_distance(距离)=math.sqrt((Ra-Rb)**+(Ga-Gb)**2+(Ba-Bb)**2)

距离越短越相似

一、算法构思?

我们可以先把现有瓷砖颜色用一个list initial[20][6](下标加1为标号)表示
然后我们每种颜色依次与initial里的元素(及现有的瓷砖颜色)比较距离大小,选出最小的那个元素返回下标。此时下标加1为标号
当然如果想增加辨识度可以设为initial[20][7]最后一个标识各个元素(标号)

二、算法实现

1.定义各个方法

1.定义一个距离方法(很普通的那种)

def distance(a,b):#a是要被匹配的单个颜色,b为已有的颜色列表,返回最相似的颜色下标加1
    min=[442,0]#第一个参数为math.sqrt(3*(255)**2),第二个参数表示标号,是下标加1
    for 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_i
            min[1]=i+1
    return min

2.定义了一个可以把字符串“(a,b,c)”转化为一个整数型的list的方法

def str_int(s):
    b = []
    for i in range(len(s)):
        if s[i] == '(':
            first=i
        if s[i] ==')':
            last=i
    s1=s[first+1:last]
    s2=s1.split(',')
    for i in range(3):
        b.append(int(s2[i]))
    return b

2.读入数据

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)

要求1整个代码加解释

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)
  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值