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名片即可

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

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

相关文章

记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端

开头 最近刷短视频看到了很多关于AI绘图&#xff0c;Midjourney&#xff0c;gittimg.ai&#xff0c;Stable Diffusion等一些绘图AI工具&#xff0c;感受到了AI绘画的魅力。通过chatGPT生成关键词再加上绘图工具&#xff0c;真是完美&#xff0c;文末教大家如何用gpt提词 Midj…

零基础学习挖掘PHP网站漏洞

教程介绍 本套课程&#xff0c;分为三个阶段&#xff1a;第一阶段&#xff1a;基础篇 学习PHP开发的基础知识&#xff0c;对PHP常见的漏洞进行分析&#xff0c;第二阶段&#xff1a;进阶篇 实战PHP漏洞靶场&#xff0c;了解市面上的PHP主流网站开发技术&#xff0c;并对市面上…

为什么Python不适合写游戏?

知乎上有热门个问题&#xff1a;Python 能写游戏吗&#xff1f;有没有什么开源项目&#xff1f; Python可以开发游戏&#xff0c;但不是好的选择 Python作为脚本语言&#xff0c;一般很少用来开发游戏&#xff0c;但也有不少大型游戏有Python的身影&#xff0c;比如&#xff1…

打造核心竞争力:高效Web系统数据中台的设计与实践_光点科技

在数字化的浪潮中&#xff0c;数据已经成为企业赖以生存和发展的核心资源。一个高效的Web系统数据中台&#xff0c;能够赋予企业在激烈的市场竞争中立于不败之地的能力。本文将深入探讨如何设计和实施一个能够提升企业数据管理水平和支持业务决策的高效数据中台架构。 数据中台…

小米还涉足了哪些领域

小米作为一家全球性的移动互联网企业&#xff0c;其业务领域相当广泛&#xff0c;除了核心的智能手机业务外&#xff0c;还涉足了许多其他领域。以下是对小米涉足领域的简要介绍&#xff1a; 智能硬件与IoT平台&#xff1a;小米是全球领先的智能硬件和IoT平台公司&#xff0c;致…

启动性能优化

一、应用启动慢的原因 1.在主线程执行了太多耗时的操作&#xff0c;比如加载数据&#xff0c;或者初始化三方库等等&#xff0c;导致在Application的oncreate或者Activity的oncreate方法中耗时太久 2.布局嵌套太深&#xff0c;或者一些不会立即使用的布局也在一开始一起加载到…

【爬虫基础】第6讲 opener的使用

在爬虫中&#xff0c;opener是一个用来发送HTTP请求的对象。它可以用来模拟浏览器发送请求&#xff0c;包括设置请求头、处理Cookie等操作。使用opener可以实现一些高级功能&#xff0c;如模拟登录、处理验证码等。 方法1&#xff1a; from urllib.request import Request,bu…

【iOS ARKit】3D文字

首先&#xff0c;3D场景中渲染的任何虚拟元素都必须具有网格&#xff08;顶点及顶点间的拓扑关系&#xff09;&#xff0c;没有网格的元素无法利用GPU 进行渲染&#xff0c;因此&#xff0c;在3D 场景申渲染 3D文字时&#xff0c;文字也必须具有网格。在计算机系统中&#xff0…

#Linux(SSH软件安装及简单使用)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;终端键入&#xff08;root权限&#xff09;安装 apt-get install openssh-server 安装时遇到报错 E: Could not get lock /var/lib/dpkg/…

【前端学习——js篇】6.事件模型

具体见&#xff1a;https://github.com/febobo/web-interview 6.事件模型 ①事件与事件流 事件(Events) 事件是指页面中发生的交互行为&#xff0c;比如用户点击按钮、键盘输入、鼠标移动等。在js中&#xff0c;可以通过事件来触发相应的操作&#xff0c;例如执行函数、改变…

javaScript | 报错:JSX expressions must have one parent element

#错误记录&#xff1a;在做一个练习时候出现这个错误 #错误原因分析&#xff1a;在React和JSX中&#xff0c;每个JSX表达式都必须有一个父元素。这意味着你想要渲染的所有组件或元素都必须被一个单独的容器所包含。这个规则的原因是JSX最终会被编译成调用React.createElement()…

C++基本语法

C是如何工作的 文章目录 C是如何工作的1、新建Hello World工程1.1使用Visual Studio新建项目1.2 HelloWorld1.2.1 命名空间1.2.2 输出输出 1.3 注释1.4 函数1.4.1 使用有返回的函数1.4.2 自定义函数 1、新建Hello World工程 1.1使用Visual Studio新建项目 按照下面的图片&…

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍&#xff08;一&#xff09; 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …

PMP考试的时间有多长?

PMP考试时长为230分钟&#xff0c;即3小时50分钟&#xff0c;这3小时50分钟的时间里&#xff0c;考生需要全神贯注&#xff0c;充分展现自己的专业水平和能力&#xff0c;既是一个考验&#xff0c;也是一个挑战&#xff0c;对于每一位参加PMP考试的考生来说&#xff0c;都是一次…

浏览器导出excel

做java web项目时&#xff0c;经常遇到需要在页面上点击导出按钮&#xff0c;然后直浏览器接下载下来一个excel文档。 比如一个List<Person>的集合&#xff0c;需要将每个Person当做一行&#xff0c;输出到excel中去。其中Person实体类如下&#xff1a; import lombok.…

智驾芯片“独角兽”地平线流血冲刺上市,三年累计亏损47亿元

3月26日&#xff0c;Horizon Robotics&#xff08;下称“地平线”&#xff09;向港交所递交招股书&#xff0c;高盛、摩根士丹利、中信建投国际为其联席保荐人。 据介绍&#xff0c;成立于2015年的地平线是一家人工智能计算平台公司&#xff0c;专注于为智能汽车提供高级辅助驾…

Vivado使用(2)——综合运行与OOC

目录 一、综合运行 二、OOC 2.1 如何设置 OOC 模块 2.2 存根文件和黑盒属性 2.3 使用限制 2.4 另一种设置方法 一、综合运行 一个“运行&#xff08;run&#xff09;”是指定义和配置设计在综合过程中的各方面&#xff0c;包括&#xff1a;使用到约束&#xff0c;针对的…

蓝桥杯算法赛(二进制王国)

问题描述 二进制王国是一个非常特殊的国家&#xff0c;因为该国家的居民仅由 0 和 1 组成。 在这个国家中&#xff0c;每个家庭都可以用一个由 0 和 1 组成的字符串 S 来表示&#xff0c;例如 101、 000、 111 等。 现在&#xff0c;国王选了出 N 户家庭参加邻国的庆典…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文&#xff0c;英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国&#xff0c;请记住我给出的原理&#xff0c;不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步&#xff1a;我们打开Uni…