2014年认证杯SPSSPRO杯数学建模B题(第一阶段)位图的处理算法全过程文档及程序
2014年认证杯SPSSPRO杯数学建模
B题 位图的处理算法
原题再现:
图形(或图像)在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形,位图则使用像素来描述图像。一般来说,照片等相对杂乱的图像使用位图格式较为合适,矢量图则多用于工程制图、标志、字体等场合。矢量图可以任意放缩,图形不会有任何改变。而位图一旦放大后会产生较为明显的模糊,线条也会出现锯齿边缘等现象。
第一阶段问题: 矢量图从本质上只是使用曲线方程对图形进行的精确描述,在以像素为基本显示单元的显示器或打印机上是无法直接表现的。将矢量图转换成以像素点阵来表示的信息,再加以显示或打印,这个过程称之为栅格化(Rasterization),见图 1。
栅格化的逆过程相对比较困难。假设有一个形状较为简单的图标,保存成一定分辨率的位图文件。我们希望将其矢量化,请你建立合理的数学模型,尽量准确地提取出图案的边界线条,并将其用方程表示出来。
整体求解过程概述(摘要)
本次的问题是让我们处理栅格化逆过程,即根据位图图像像素点阵,得到矢量图形的几何特征,矢量图形本质上是使用曲线方程对图像进行精确描述,利用计算机辅助我们提取位图像素点阵特征,根据具体的拟合算法输出矢量图形。
首先,我们仔细分析图形信息,对图像进行了灰度处理,即对图像去彩色化。通过观察图像的灰度直方图,我们发现灰度直方图有双峰特性,采用 ostu 算法对图像进行了分割以及区域二值化,我们尝试了多种边缘检测算子,通过画图比较决定使用ostu+canny算子的方式进行边缘提取。从而得到边缘数据点。
然后,观察边缘数据点的分布情况,我们发现其在电脑内的存储状态没有构成点序列,出于对后面数据操作的便利,我们采用了 freeman 码的方式,对边界数据进行边缘跟踪,产生数据有序化,并在此过程中找出边界数据的突变点(尖点),为下一步的轮廓曲线拟合做准备。
接着,我们对有序化的边界数据进行了两种方式的拟合。第一种是采用抛物线样条曲线拟合,在之前的步骤中,我们得到了图形边界的尖点信息,由于整个图形是封闭的,我们以这些尖点作为分段点,在分段点区间内进行抛物线样条拟合,拟合标准便是所有点的偏差最小。从而得到边界轮廓方程。采取的第二种方法是针对于题目所给图像的特征,我们采取了分段函数拟合的办法,第一部分采用椭圆拟合的方式;第二部分是图形下部尖端部分,我们采用多项式拟合方式,最终得到边界图与边界方程。第一种方法具有一定的普适性,可以应用于任意形状的图形的拟合,拟合效果较为理想;第二种方法具有特殊性,针对有特定图像的拟合效果相对更好。
随后,在得到边界拟合曲线的基础上,我们综合比较了现在较为主流的种子填充算法和扫描线填充算法,并根据此次问题实际情况,提出了改进版本的扫描线填充算法,在进行边界内部填充的过程中,我们针对难填充的区域进行了区域划分,使得每一个区域都能够完美填充。
最后,我们考虑到图形程序较为复杂,与人的交互性较差,我们采用了简单的 matlab gui 界面方式对部分程序结果进行了统一展示,提高了程序的可视化以及人机交互性。
问题分析:
这次的问题是栅格化的逆过程,也即是从位图到矢量化图形的过程。由于位图计算机存储的是每个像素点的信息,而矢量图形计算机存储的是其几何特征。所以在栅格化逆过程中我们必须要考虑位图图像的几何特征,并想办法提取这些几何特征。对于一个封闭图形,我们如果能够知道图形的边界方程、线条的粗细以及颜色,那么我们最后的工作就是展现这些特征所标识的矢量图形。
图形的边界方程的获取一般会涉及边界区域的确定,进而得到边界数据点,并将数据点有序化。一般对于边界的拟合有多边形近似、样条插值拟合和分段函数拟合,而大部分拟合方法要求数据的有序化。
线条的粗细可以根据边界提取后的边界数据来确定,而颜色可以通过对于位图像素点的提取来确定。
模型假设:
假设 1:照片像素在 MATLAB 的处理范围内。
假设 2:填充的图形是封闭的,如果边缘本身有断点,用函数 bwfill 进行“补洞”操作;
假设 3:对于图片的比较微细小的部分,用膨胀函数 dilate 进行原图膨胀。
论文缩略图:
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
部分程序代码:(代码和文档not free)
function cl=clusterp(pic)
a=pic;
count=imhist(a);
[m,n]=size(a);
N=m*n;
L=256;
count=count/N;
for i=1:L
if count (i)~=0
st=i-1;
break;
end
end
for i=L:-1:1
if count (i)~=0
nd=i-1;
break;
end
end
F=count(st+1:nd+1);
p=st;
q=nd-st;
u=0;
for i=1:q
u=u+f(i)*(p+i-1);
ua(i)=u;
end;
for i=1:q
w(i)=sum(f(1:i));
end;
d=(u*w-ua).^2./(w.*(1-w));
[y,tp]=max(d);
th=tp+p;
for i=1:m
for j=1:n
if a(i,j)<th
a(i,j)=0;
else
a(i,j)=255;
end
end
end
imshow(a);
clear all
clc
F=imread('C:\Users\pc\Desktop\gui\图片1.png');
F1=rgb2gray(F);
F2=im2bw(F1);
m1=edge(F2,'canny');
m2=edge(F2,'sobel');
m3=edge(F2,'roberts');
m4=edge(F2,'log');
m5=bwperim(F2,4);
F=rgb2gray(F);
m6=F;
count=imhist(m6);
[m,n]=size(m6);
N=m*n;
L=256;
count=count/N;
for i=1:L
if count(i)~=0
st=i-1;
break;
end
end
for i=L:-1:1
if count(i)~=0
nd=i-1;
break;
end
end
f=count(st+1:nd+1);
p=st;
q=nd-st;
u=0;
for i=1:q
u=u+f(i)*(p+i-1);
ua(i)=u;
end;
for i=1:q
w(i)=sum(f(1:i));
end;
d=(u*w-ua).^2./(w.*(1-w));
[y,tp]=max(d);
th=tp+p;
for i=1:m
for j=1:n
if m6(i,j)<th
m6(i,j)=0;
else
m6(i,j)=255;
end
end
end
subplot(2,2,2);
imshow(m6);
subplot(2,2,3);m6=edge(m6,'canny');
imshow(m6);
m11=imcomplement(m1);
m21=imcomplement(m2);
m31=imcomplement(m3);
m41=imcomplement(m4);
m51=imcomplement(m5);
[L,W]=size(m51);
m51(:,1)=1;m51(:,W)=1;m51(1,:)=1;m51(L,:)=1;
m61=imcomplement(m6);
subplot(2,3,1),imshow(m11),title('canny算子')
subplot(2,3,2),imshow(m21),title('sobel算子')
subplot(2,3,3),imshow(m31),title('roberts算子')
subplot(2,3,4),imshow(m41),title('log算子')
subplot(2,3,5),imshow(m51),title('bwperim')
subplot(2,3,6),imshow(m61),title('ostu+canny算子')
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可
相关文章:

2014年认证杯SPSSPRO杯数学建模B题(第一阶段)位图的处理算法全过程文档及程序
2014年认证杯SPSSPRO杯数学建模 B题 位图的处理算法 原题再现: 图形(或图像)在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形,位图则使用像素来描述图像。一般来说&#…...

【物联网项目】基于ESP8266的家庭灯光与火情智能监测系统——文末完整工程资料源码
目录 系统介绍 硬件配置 硬件连接图 系统分析与总体设计 系统硬件设计 ESP8266 WIFI开发板 人体红外传感器模块 光敏电阻传感器模块 火焰传感器模块 可燃气体传感器模块 温湿度传感器模块 OLED显示屏模块 系统软件设计 温湿度检测模块 报警模块 OLED显示模块 …...
Unity中控制帧率的思考
如何控制帧率: 在Unity中,你可以通过设置Application.targetFrameRate来限制帧率。 例如,如果你想将帧率限制为16帧, 你可以在你的代码中添加以下行: Application.targetFrameRate 16; 通常,这行代码会放在…...
阿里云子域名配置,且不带端口访问
进入阿里云控制台,创建一个SSL证书 # 域名名称child.domain.com创建完成后,将返回主机记录以及记录值,保存好,用于下一步使用 创建DNS解析 创建DNS的TXT类型解析 选择记录类型:TXT 填写主机记录:_dnsa…...
C#-ConcurrentDictionary用于多线程并发字典
ConcurrentDictionary 是 .NET Framework 中用于多线程并发操作的一种线程安全的字典集合类。它提供了一种在多个线程同时访问和修改字典时保持数据一致性的机制。 以下是 ConcurrentDictionary 类的一些重要特性和用法: 线程安全性:ConcurrentDictiona…...

深入探讨多线程编程:从0-1为您解释多线程(下)
文章目录 6. 死锁6.1 死锁原因 6.2 避免死锁的方法加锁顺序一致性。超时机制。死锁检测和解除机制。 6. 死锁 6.1 死锁 原因 系统资源的竞争:(产生环路)当系统中供多个进程共享的资源数量不足以满足进程的需要时,会引起进程对2…...

深度学习pytorch——减少过拟合的几种方法(持续更新)
1、增加数据集 2、正则化(Regularization) 正则化:得到一个更加简单的模型的方法。 以一个多项式为例: 随着最高次的增加,会得到一个更加复杂模型,模型越复杂就会更好的拟合输入数据的模型(图-1)&#…...

排序第五篇 归并排序
一 简介 归并排序(Merge Sort) 的基本思想是: 首先将待排序文件看成 n n n 个长度为1的有序子文件, 把这些子文件两两归并, 得到 n 2 \frac{n}{2} 2n 个长度为 2 的有序子文件; 然后再把这 n 2 \frac{n}{2} 2n 个有序的子…...

【Win】使用PowerShell和Webhooks轻松发送消息至Microsoft Teams
Microsoft Teams是一款由微软开发的团队协作和通讯工具。如果您对这个名字还不太熟悉,那么现在就是一个了解它的好时机。微软将Teams定位为其之前Skype for Business解决方案的继任者,并且它也提供了与其他基于频道的通讯应用程序(例如Slack、…...

ESCTF-OSINT赛题WP
这你做不出来?check ESCTF{湖北大学_嘉会园食堂} 这个识图可以发现是 淡水渔人码头 但是 osint 你要发现所有信息 聊天记录说国外 同时 提示给了美国 你综合搜索 美国 渔人码头 在美国旧金山的渔人码头(英语:Fisherman’s Wharf)是一个著名旅…...
2024蓝桥杯省赛保奖突击班-Day2-前缀和、差分、尺取_笔记_练习题解
3月25日-课堂笔记 前缀和预处理 O ( n ) \mathcal{O}(n) O(n) s[1] a[1]; for(int i 2; i < n; i)s[i] s[i - 1] a[i];利用前缀和查询区间和 O ( 1 ) O(1) O(1) long long calc(int l, int r) {return l 1 ? s[r] : s[r] - s[l - 1]; }差分序列的求法 c[1] a[…...

C++基础之虚函数(十七)
一.什么是多态 多态是在有继承关系的类中,调用同一个指令(函数),不同对象会有不同行为。 二.什么是虚函数 概念:首先虚函数是存在于类的成员函数中,通过virtual关键字修饰的成员函数叫虚函数。 性质&am…...
快速入门Kotlin①基本语法
前言 23年底读了一遍“Kotlin官方文档”,官方文档大而全,阅读下来,大有裨益。 此系列文章的目的是记录学习进程,同时,若能让读者迅速掌握重点内容并快速上手,那就再好不过了。 函数 带有两个 Int 参数、…...

【理解指针(四)】
文章目录 一、指针数组二、指针数组来模拟二维数组三、字符指针变量注意: 字符串的例子(曾经的一道笔试题) 四、数组指针变量1、什么是数组指针变量2、数组指针怎么初始化 五、二维数组传参的本质六、函数指针1、什么是函数指针变量2、函数的…...

Ribbon简介
目录 一 、概念介绍 1、Ribbon是什么 2、认识负载均衡 2.1 服务器端的负载均衡 2.2 客户端的负载均衡 3、Ribbon工作原理 4、Ribbon的主要组件 IClientConfig ServerList ServerListFilter IRule Iping ILoadBalancer ServerListUpdater 5、Ribbon支持…...

【感悟《剑指offer》典型编程题的极练之路】02字符串篇!
个人主页:秋风起,再归来~ 文章所属专栏:《剑指offer》典型编程题的极练之路 个人格言:悟已往之不谏,知来者犹可追 克心守己,…...
通过 Docker 实现国产数据库 OpenGauss 开发环境搭建
通过 Docker 实现国产数据库 OpenGauss 开发环境搭建 一 前置准备 2.1 下载镜像 docker pull enmotech/opengauss:5.0.1构建镜像的 Dockerfile,方便后期实现个性化定制: FROM ubuntu:22.04 as builderARG TARGETARCHWORKDIR /warehouseRUN set -eux;…...

【Java】LinkedList模拟实现
目录 整体框架IMyLinkedList接口IndexNotLegalException异常类MyLinkedList类成员变量(节点信息)addFirst(头插)addLast(尾插)在指定位置插入数据判断是否存在移除第一个相等的节点移除所有相等的节点链表的长度打印链表释放回收链表 整体框架 IMyLinkedList接口 这个接口用来…...
ubuntu下mysql常用命令
1. 登录数据库 mysql -u root -p 2.创建数据库 create database 数据库名字 mysql> create database yourdb; Query OK, 1 row affected (0.03 sec)3.显示数据库 show databases; 实操结果如下 mysql> show databases; -------------------- | Database | ---…...

燃气官网安全运行监测系统-阀井燃气监测仪-旭华智能
近年来,燃气爆炸事故频发,造成了重大人员伤亡和财产损失。这也再次为我们敲响警钟,燃气是我们日常生活中不可或缺的能源,但其潜在的危险性也是不容小觑。因此在重要节点加装燃气阀井气体监测仪,并将数据上传到系统平台…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...