2014年认证杯SPSSPRO杯数学建模B题(第二阶段)位图的处理算法全过程文档及程序

本文主要是介绍2014年认证杯SPSSPRO杯数学建模B题(第二阶段)位图的处理算法全过程文档及程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2014年认证杯SPSSPRO杯数学建模

B题 位图的处理算法

原题再现:

  图形(或图像)在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形,位图则使用像素来描述图像。一般来说,照片等相对杂乱的图像使用位图格式较为合适,矢量图则多用于工程制图、标志、字体等场合。矢量图可以任意放缩,图形不会有任何改变。而位图一旦放大后会产生较为明显的模糊,线条也会出现锯齿边缘等现象。
  第二阶段问题: 位图在放大时,图像质量常会有所下降,如容易产生较为明显的模糊或马赛克等现象(见图2)。请你建立合理的数学模型,来设计一个放大位图的算法,使图像在被放大后仍能尽量保持较好的图像质量。
在这里插入图片描述
在这里插入图片描述

整体求解过程概述(摘要)

  本文针对位图的放大问题,以题中所给的位图为切入点,综合分析了位图各像素点的坐标及其对应的RGB分量,并通过文献的查阅,基于插值图像边缘部分的分辨率对整个图像放大的重要影响,确立了对边缘部分与非边缘部分采取不同插值算法的建模思路,建立了基于Sobel算子改进后的彩色图像边缘检测模、Thiele - Newton插值法图像边缘部分放大模型、图像放大的分片连续模型和图像“质检—去噪—后处理”模型,运用Matlab软件,C++对图像数据进行处理、分析。最后,对整个模型存在的不足与优点进行讨论,提出对原模型的改进和推广。
  针对问题一,首先,使用改进后的适用于彩色图像的Sobel算法对原图像,借助C++程序对图像进行边缘检测,得到边缘像素点及其RGB值。然后,对边缘像素点进行精密的Thiele - Newton二元有理插值,实现边缘区域的放大算法。
  针对问题二,通过对非边缘图像划分区域段,建立段内连续函数,连续段间的延拓将其分为分片连续的曲面。然后,将整个非边缘曲面表示为了二元的分片连续函数,通过像素RGB分量在新坐标系中的映射关系实现非边缘区域的放大算法。
  针对问题三,首先,问题一与问题二中模型所产生两部分区域放大的组合已初步实现了整个图像的高保真放大,但基于对图像清晰度及背景平滑性的考虑,需要对放大后的图像进行进一步处理。使用彩色图像矢量中通滤波进行去噪处理,并利用反锐化掩模法对插值图像的细节进行进一步增强。本文还对模型的误差进行了具体分析;对模型的优化提出了针对性的改进,分析了模型存在优势与不足。最后,我们又对模型进行了多个方向的推广,分析了其在三维图像放大处理与二维图像缩小处理上的应用前景。

问题分析:

  问题一:对彩色图像进行边缘区域检测并对其进行边缘插值。
将问题一拆分为两个部分:第一,改进Sobel算子,对目标彩色图像边缘区域进行检测;第二,对边缘区域像素点进行插值。首先,运用数学软件Matlab对检测目标图像的边缘区域,得到轮廓像素点的坐标及其对应的RGB分量。考虑到Sobel算子对灰度图像边缘检测效果较好,但是对彩色图像边缘检测会出现边缘模糊的现象,影响后续图像处理。因此,根据彩色图像特点,通过计算RGB分量梯度值,改进Sobel边缘检测方法,提升边缘检测效果。其次,在图像边缘区域采取自适应插值算法,运用较小的运算价,以便能够得到更好的放大效果。

  问题二:对图像进行分片处理,确定局部连续区域(非边缘区域)分片为曲面,并对曲面进行插值。经过模型Ⅰ和模型Ⅱ对图像边缘像的检测提取并进行插值放大处理后,我们需要对大量的非边缘图像部分进行放大处理。使用较为普遍的算法如最近邻域法,双线性内插法,三次内插法等方法虽然能够快速生成较为视觉效果较为良好的目的图像,但仍然存在图像中物体边界区域模糊的问题,限制了其在实际生活场合以及专业图像处理场合的应用。基于此,我们采用一种图像的分片连续数学模型,先将图像分片为连续的曲面,再对曲面进行插值,将原始图像用二元分片连续函数表示,进而对非边缘部分进行放大处理。

  问题三:对目标图像进行放大后的质量提升处理。经过对目标图像两部分有针对性地进行不同的插值放大算法后,我们得到了目标图像初步放大后的结果。但为了保证放大后图像的视觉质量,我们需要对放大后的图像进行如下操作:
在这里插入图片描述

模型假设:

  1.假设目标图像水平清晰度较高,图像质量较高。
  2.假设目标图像尺寸较小,像素点数量有限,可以进一步进行图像放大。
  3.假设目标图像可能被噪声污染,存在一定噪点,需要进行去噪处理。
  4.假设对目标图像的像素点进行插值得到的曲线或平面具有一定的光滑性。

论文缩略图:

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{
// TODO: Add your command handler code here
//定义的变量
IplImage* pImage= NULL; // 声明 IplImage 变量
IplImage* pImgSobelgray= NULL;// 声明 IplImage 变量,用于灰度图像 Sobel 变换
IplImage* pImg8u= NULL;// 声明 IplImage 变量,用于图像格式转换
IplImage* pImg8uSmooth= NULL;// 声明 IplImage 变量,用于存储平滑后的图像
IplImage* pImgColor= NULL;// 声明 IplImage 变量,用于 Sobel 变换IplImage* pImgSobelcolor= NULL;// 声明 IplImage 变量,用于彩色图像 Sobel 变换
IplImage* pImgPlanes[3] = { 0, 0, 0 };
IplImage* pImage = cvLoadImage ( "barbara.png", CV_LOAD_IMAGE_GRAYSCALE );
cvNamedWindow ( "Original Image " , 1 );
cvShowImage ( " Original Image " , img );
//将已读入系统的图像复制一份
//pImage=cvCloneImage( img );
//建立和原始图像一样图像内存区,图像元素的位深度设为 IPL_DEPTH_8U 
//即无符号 8 位整型
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
//对灰度图像进行 Sobel 变换
//将彩色图像转换为灰度图像
cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
//对图像进行高斯滤波
cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0);
//建立一新图像内存区,图像元素的位深度设为 IPL_DEPTH_16S 有符号 16 位整型
//因为 cvSobel 函数要求目标图像必须是 16-bit 图像
pImgSobelgray = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S, 1);
//计算一阶 x 方向的图像差分,可根据需要设置参数
cvSobel(pImg8uSmooth, pImgSobelgray,0,1,3);
//将图像格式再转换回来,用于显示cvConvertScaleAbs(pImgSobelgray,pImg8u,1,0 ) ;
//创建窗口,显示图像
cvvNamedWindow( "Sobel gray Image", 1 ); cvvShowImage( "Sobel gray Image", pImg8u ); 
//对彩色图像进行 Sobel 变换
//建立 3 个图像内存区,分别存储图像 3 个通道,图像元素的位深度设为 IPL_DEPTH_8U
int i;
for( i = 0; i < 3; i++ )
pImgPlanes[i] = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 1 );
//建立一新图像内存区,图像元素的位深度设为 IPL_DEPTH_16S 有符号 16 位整型
pImgSobelcolor = cvCreateImage( cvSize(pImage ->width, pImage ->height), 
IPL_DEPTH_16S, 1 );
//要求输出图像是 16 位有符号的
pImgColor = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 3 );
//将彩色图像分成 3 个单通道图像
cvCvtPixToPlane(pImage, pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0 );
for( i = 0; i < 3; i++ )
{
//分别对每通道图像进行 Sobel 变换
cvSobel( pImgPlanes[i], pImgSobelcolor,0,1,3 );
//转化为 8 位的图像
cvConvertScaleAbs(pImgSobelcolor, pImgPlanes[i], 1, 0 ); 
}
//将各通道图像进行合并
cvCvtPlaneToPix( pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0, pImgColor);
//创建窗口,显示图像
cvvNamedWindow( "Sobel color Image", 1 ); 
cvvShowImage( "Sobel color Image", pImgColor); 
//等待按键
cvWaitKey(0); 
//销毁窗口
cvDestroyWindow( " Sobel gray Image " );
cvDestroyWindow( " Sobel color Image " );
//将程序开始定义的变量释放
cvReleaseImage( & pImage);
cvReleaseImage( & pImgSobelgray);
cvReleaseImage( & pImgSobelcolor);
cvReleaseImage( & pImg8u);
cvReleaseImage( & pImg8uSmooth);
return 0;
}
I=imread('写入图片存放的位置,后缀.图像格式');
I1=rgb2gray(I);
I2=medfilt2(I1,[m,n]);
%%%I2 就是中值滤波后的图像,medfilt2 是 matlab 中中值滤波函数,直接调用即可,m 和 n
是选取的平滑窗口,一般为 3*3,可以进行调整
要分离的话,可以这样做:
M=imread('D:\ebook\lena.bmp'); %读取 MATLAB 中的名为 cameraman 的图像
subplot(2,2,1)
imshow(M) %显示原始图像
title('original')
P1=imnoise(M,'gaussian',0.02); %加入高斯躁声
subplot(2,2,2)
imshow(P1) %加入高斯躁声后显示图像
title('gaussian noise');
g1=medfilt2(P1(:,:,1));%%红
g2=medfilt2(P1(:,:,2));%%绿
g3=medfilt2(P1(:,:,3));%%蓝
g(:,:,1)=g1;
g(:,:,2)=g2;
g(:,:,3)=g3;
subplot(2,2,3)
imshow(g)
title('medfilter gaussian')
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

这篇关于2014年认证杯SPSSPRO杯数学建模B题(第二阶段)位图的处理算法全过程文档及程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855986

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

mac安装redis全过程

《mac安装redis全过程》文章内容主要介绍了如何从官网下载指定版本的Redis,以及如何在自定义目录下安装和启动Redis,还提到了如何修改Redis的密码和配置文件,以及使用RedisInsig... 目录MAC安装Redis安装启动redis 配置redis 常用命令总结mac安装redis官网下

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

SpringBoot3集成swagger文档的使用方法

《SpringBoot3集成swagger文档的使用方法》本文介绍了Swagger的诞生背景、主要功能以及如何在SpringBoot3中集成Swagger文档,Swagger可以帮助自动生成API文档... 目录一、前言1. API 文档自动生成2. 交互式 API 测试3. API 设计和开发协作二、使用

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

Kibana的安装和配置全过程

《Kibana的安装和配置全过程》Kibana是一个开源的数据分析和可视化平台,它与Elasticsearch紧密集成,提供了一个直观的Web界面,使您可以快速地搜索、分析和可视化数据,在本文中,我们... 目录Kibana的安装和配置1.安装Java运行环境2.下载Kibana3.解压缩Kibana4.配

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

若依部署Nginx和Tomcat全过程

《若依部署Nginx和Tomcat全过程》文章总结了两种部署方法:Nginx部署和Tomcat部署,Nginx部署包括打包、将dist文件拉到指定目录、配置nginx.conf等步骤,Tomcat部署... 目录Nginx部署后端部署Tomcat部署出现问题:点击刷新404总结Nginx部署第一步:打包

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na