- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.
近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。
博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html
1、 掌握并通过编程实现均值滤波算法。
2、 掌握并通过编程实现中值滤波算法,先对图像加噪声,通过算法去除噪声。
3、 掌握并通过编程实现拉普拉斯锐化算法。
在程序中,分别在对应的函数位置添加相应算法的代码,实现均值滤波、中值滤波、拉普拉斯锐化算法,最后用MISS图片来反映这三种算法的效果。
1) 原理
(1) 均值滤波也称为领域平均法,是一种图像平滑算法,图像平滑是指用于突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量的图像处理方法。可以用加权平均或者非加权平均。
(2) 中值滤波,原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
(3) 图像锐化处理的目的是为了使图像的边缘、 轮廓线以及图像的细节变的清晰,经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如 微分运算)就可以使图像变的清晰。
2) 流程
(1) 打开VC++6.0,打开工作空间,然后打开project。
(2) 找到图像平滑函数,在相应位置添加代码。先开辟一个新的空间lpSrc,存放平滑后的图像;将源图像的像素点领域分别与a[i]相乘,做加权或非加权处理得到目标图像的像素值。
(3) 先在GetMedianNum函数中添加代码,补充完整,此函数用来将源图像的像素点和它的领域冒泡排序,返回中指。找到中值滤波函数,在相应位置添加代码。先开辟一个新的空间lpSrc,存放中值滤波后的图像;在循环中得到对应的目标图像图像的像素值。
(4) 图像锐化和图像平滑过程类似,但是不用做加权或者非加权处理,因为它的a[i]的系数和始终为1。
3) 数据输出
分析:图像平滑突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量。
分析:中值滤波可以去除图片中的噪声,但是拐角处不能去除,因为拐角处占的比例比较大。
分析:先对图像作平滑处理,然后再进行图像锐化操作,最开始,图像锐化对图片的边缘有明显的效果,再继续图像锐化,图片就会呈现块状。
均值滤波:
double *tempt=new double[lWidth*lHeight];
int *b=new int[9];
int k;
double sum,mean;
for(i=1;i<lHeight-1;i++)
{
for(j=1;j<lWidth-1;j++)
{
lpSrc=lpDIBBits+lLineBytes*i+j;
b[0]=*(lpDIBBits+lLineBytes*(i-1)+j-1);
b[1]=*(lpDIBBits+lLineBytes*(i-1)+j);
b[2]=*(lpDIBBits+lLineBytes*(i-1)+j+1);
b[3]=*(lpDIBBits+lLineBytes*i+j-1);
b[5]=*(lpDIBBits+lLineBytes*i+j);
b[6]=*(lpDIBBits+lLineBytes*(i+1)+j-1);
b[7]=*(lpDIBBits+lLineBytes*(i+1)+j);
b[8]=*(lpDIBBits+lLineBytes*(i+1)+j+1);
sum=0;
mean=0;
for(k=0;k<9;k++)
{
sum=sum+a[k]*b[k];
mean=sum/9;
}
tempt[lWidth*i+j]=mean;
}
}
for(i=1;i<lHeight-1;i++)
{
for(j=1;j<lWidth-1;j++)
{
lpSrc=lpDIBBits+lLineBytes*i+j;
if(tempt[lWidth*i+j]>255)
{
*lpSrc=(unsigned char)255;
}
else if(tempt[lWidth*i+j]<0)
{
*lpSrc=(unsigned char)0;
}
else
{
*lpSrc=(unsigned char)tempt[lWidth*i+j];
}
}
}
中值滤波:
int *tempt=new int[lWidth*lHeight];
unsigned char *b=new unsigned char[9];
for(i=1;i<lHeight-1;i++)
{
for(j=1;j<lWidth-1;j++)
{
lpSrc=lpDIBBits+lLineBytes*i+j;
b[0]=*(lpDIBBits+lLineBytes*(i-1)+j-1);
b[1]=*(lpDIBBits+lLineBytes*(i-1)+j);
b[2]=*(lpDIBBits+lLineBytes*(i-1)+j+1);
b[3]=*(lpDIBBits+lLineBytes*i+j-1);
b[5]=*(lpDIBBits+lLineBytes*i+j);
b[6]=*(lpDIBBits+lLineBytes*(i+1)+j-1);
b[7]=*(lpDIBBits+lLineBytes*(i+1)+j);
b[8]=*(lpDIBBits+lLineBytes*(i+1)+j+1);
tempt[lWidth*i+j]=GetMedianNum(b,9);
}
}
for(i=1;i<lHeight-1;i++)
{
for(j=1;j<lWidth-1;j++)
{
lpSrc=lpDIBBits+lLineBytes*i+j;
if(tempt[lWidth*i+j]>255)
{
*lpSrc=(unsigned char)255;
}
else if(tempt[lWidth*i+j]<0)
{
*lpSrc=(unsigned char)0;
}
else
{
*lpSrc=(unsigned char)tempt[lWidth*i+j];
}
}
}
锐化:
double *tempt=new double[lWidth*lHeight];
int *b=new int[9];
int k;
double sum;
for(i=1;i<lHeight-1;i++)
{
for(j=1;j<lWidth-1;j++)
{
lpSrc=lpDIBBits+lLineBytes*i+j;
b[0]=*(lpDIBBits+lLineBytes*(i-1)+j-1);
b[1]=*(lpDIBBits+lLineBytes*(i-1)+j);
b[2]=*(lpDIBBits+lLineBytes*(i-1)+j+1);
b[3]=*(lpDIBBits+lLineBytes*i+j-1);
b[5]=*(lpDIBBits+lLineBytes*i+j);
b[6]=*(lpDIBBits+lLineBytes*(i+1)+j-1);
b[7]=*(lpDIBBits+lLineBytes*(i+1)+j);
b[8]=*(lpDIBBits+lLineBytes*(i+1)+j+1);
sum=0;
for(k=0;k<9;k++)
{
sum=sum+a[k]*b[k];
}
tempt[lWidth*i+j]=sum;
}
}
for(i=1;i<lHeight-1;i++)
{
for(j=1;j<lWidth-1;j++)
{
lpSrc=lpDIBBits+lLineBytes*i+j;
if(tempt[lWidth*i+j]>255)
{
*lpSrc=(unsigned char)255;
}
else if(tempt[lWidth*i+j]<0)
{
*lpSrc=(unsigned char)0;
}
else
{
*lpSrc=(unsigned char)tempt[lWidth*i+j];
}
}
}
博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html
我正在尝试使用增强的 for 循环遍历 Iterable,但我无法确定何时处理最后一个值。 public void apply(Tuple key,
我正在使用以下代码在 Sheet2 的 A:H 范围内查找和替换 Sheet1 中存在的单词列表(ColA 用于 FIND 单词,ColB 用于 REPLACE 单词)。它执行这项工作,但非常缓慢。可
我正在使用 Hibernate (JPA2) hibernate.hbm2ddl.auto=update用于测试和 hibernate.hbm2ddl.auto=validate用于生产。 我想要做的
基本问题: 为什么我只能用 Scala 编写: println(10) 为什么我不需要写: Console println(10) 后续问题: 如何引入一个新方法“foo”,它像“println”一样
我正在尝试将 Maven 项目迁移到 Bazel,但在 Datanucleus 增强方面遇到了麻烦。 后 jar -file 已构建,Datanucleus 会查看其中的内部并执行一些字节码操作以增强
正在使用 css3 转换进行漂亮的导航。为此还编写了一些 javascript。 但不幸的是它看起来有点凌乱。你们能给我一些优化 javascript 代码的技巧吗? 笔--> http://code
我想将自定义任务绑定(bind)到默认构建器发布周期中。我想在项目编译、打包、标记和部署之后但在增加版本号并提交之前运行此代码。 我将如何融入发布周期的这一部分? 最佳答案 不幸的是,release
我使用ElasticSearch 6.6。我的应用程序通过从不同数据源提取数据来构建ES索引。搜索未指定数据源。它只是建立一个类似的查询: GET employerdata/_search { "
我正在使用此代码将“k1 = v1; k2 = v2; k3 = v3; kn = vn”字符串解析为映射。 qi::phrase_parse( begin,end,
我正在试图弄清楚作业的一部分,但我已经把头撞在墙上有一段时间了。我正在尝试将 DNA 序列转录为 RNA 序列。然而,我收到了 ArrayOutOfBoundsException。我不熟悉使用增强的
我需要对基于 python Google App Engine 的应用程序的警告进行分类。我从 GAE stackdriver 下载日志。我认为 GAE Stackdriver 错误报告位于 http
我有一个 django charField,通过 is_valid() 方法进行检查。用户应该在此字段中输入有效的逻辑表达式,因此我编写了一个解析方法,如果表达式不正确,该方法会引发异常。 如何增强
我编写了以下控制台应用程序,要求用户输入一天。 我需要一些帮助才能改进,以便他们为一周中的所有日子提供正确的答案。 如果用户输入除星期一以外的任何其他日期,则输出为“今天”、“昨天”、“明天”,并在这
我在使用带有 ES6 let 关键字的模块模式(扩充)时遇到错误。 这有效。 var Example = ( Example => { Example.name = ""; retur
我只是问是否线程安全可以使用 我明确指出“doSomething()”是线程安全的。 最佳答案 线程安全取决于您正在迭代的 Collection,而不是 enhanced for 的使用。如果 Col
我有一个非常符合 this Jquery demo 的要求,这是一个简单的购物车演示。基本上,我需要对该演示进行两项改进。 我需要文本输入以及可用的“产品”。因此,当我拖放其中一种产品时,文本字段应随
我正在三个表 messages、message_recipients 和 users 上运行查询。 messages表的表结构: id int pk message_id int message te
这个问题已经有答案了: In detail, how does the 'for each' loop work in Java? (29 个回答) 已关闭 4 年前。 由于增强的 for 循环是只读
我在 css 中制作了一个很酷的鼠标悬停,当父级鼠标悬停时它会显示动画 gif。 这是我的代码:http://codepen.io/clemeeent/pen/oggzMa 问题是我将有大约 40 天
目前,当使用 Knockout foreach 绑定(bind)时,您可以使用 $index 访问当前索引。我想让其他类似的功能可用于我的内部绑定(bind) - 例如: array(让我访问正在操作
我是一名优秀的程序员,十分优秀!