下面这个题我做了好久,老师说用不到OpenCV,所以我觉得应该用编程读取文件的操作,但我又不知道用C++或者Java如何读取图片文件,所以这里对于我来说是一个问题,当我发现读取文件之后,我又不知道怎么对图片的像素进行处理,这又是一个新的问题,所以,经过这2个问题,接触到了自己的知识盲区,也就是我需要掌握的知识,这给我的学习带来了极大的帮助,问题的原因吸引着我,让我有继续学下去的动力,所以大家一定要找到自己热爱的事物,因为你对它有兴趣,你才会主动探索他,这样你也就会越走越远,达到新的高度,从而成为自己心目中的英雄。

方法一:加入随机噪声

加入随机噪声的方法可以这样理解:
如果你把图像看作信号,那么噪声就是干扰信号。我们在采集图像时可能因为各种各样的干扰而引入图像噪声。
那么我们可以把图像看作一个函数,那么带有噪声的图像,就可以看作是原始图像函数与噪声函数相加的和。
f(x,y) = I(x,y)+noise ~~~~     //这里的noise在程序中可以看做是一个没有参数的函数

import java.io.*;
import java.util.*;
import java.security.cert.PolicyNode;
import java.lang.StringBuffer;
import java.util.HashMap;
import java.util.Map.Entry;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;public class Main {private BufferedImage original;private void readOriginal() {File f=new File("original.jpg");//这里新创建了一个对象叫 original.jpg 的文件try{//读取图片original=ImageIO.read(f);//然后来到当前目录下面去找是否有这个文件,所以要先在当前文件夹中复制一个名为 original.jpg 的文件,这样才可以找到} catch (IOException e) {//如果找不到这个图片则抛出异常e.printStackTrace();}}private double randomNoise(){//产生随机噪声return (Math.random()-0.5)*3;//返回从-0.5到0.5的一个随机值}private void dither(){BufferedImage imRes=new BufferedImage(original.getWidth(),original.getHeight(),BufferedImage.TYPE_INT_RGB);int n=original.getWidth();//图像的宽度int m=original.getHeight();//长度for(int i=0;i<n;++i){for(int j=0;j<m;++j)imRes.setRGB(i,j,original.getRGB(i,j)+(int)(randomNoise()));//这里就是上面文字的解释,在原像素值的基础上加入一些随机值,即加入随机噪声}try{//如果成功实现抖动,就保存图片到当前文件夹下ImageIO.write(imRes,"PNG",new File("result.jpg"));//保存该文件,类型为jpg}catch(IOException e){//否则抛出异常e.printStackTrace();}}public static void main(String[] args) {Main d=new Main();d.readOriginal();d.dither();}
}

下面主要讲解一下文件是保存在什么位置:
首先在程序执行之前,应该在当前文件夹下有一个名为 original.jpg 的文件,当然文件类型肯定是jpg了。

比如说一开始我放的原灰度图像是这个,也就是 original.jpg

当文件夹下面有该图片时,则可以执行程序了,顺利执行完之后就会新生成一个 result.jpg 的文件,这样即使添加完随机噪声之后的图片,如下:

这样添加随机噪声的方式实现抖动就可以了。

方法二:有序抖动

有序抖动的文件读写和加入随机噪声相似,所以这里不需要重点介绍,需要说的就是实现有序抖动的原理:

import java.io.*;
import java.util.*;
import java.security.cert.PolicyNode;
import java.util.Scanner;//输入头文件
import java.util.Arrays;//引入数组类
import java.lang.StringBuffer;
import java.util.HashMap;
import java.util.Map.Entry;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;public class Main {private BufferedImage original;//4*4抖动矩阵private  double mat[][]={{0,8,2,10},{12,4,14,6},{3,11,1,9},{15,7,13,5}};private void readOriginal() {File f=new File("original.jpg");try{//读取图片original=ImageIO.read(f);} catch (IOException e) {//如果找不到这个图片则抛出异常e.printStackTrace();}}private void dither() {BufferedImage imRes=new BufferedImage(original.getWidth(),original.getHeight(),BufferedImage.TYPE_INT_RGB);int n=original.getWidth();//图像的宽度int m=original.getHeight();//长度for(int i=0;i<n;++i){for(int j=0;j<m;++j){int color=original.getRGB(i,j);int red=(color>>>16)&0xFF;int green=(color>>>8)&0xFF;int blue=(color>>>0)&0xFF;double lum=(red+green+blue)/255;if(lum>mat[i%4][j%4])imRes.setRGB(i,j,0xFFFFFF);elseimRes.setRGB(i,j,0x000000);}}try{//如果成功实现抖动,就保存图片到当前文件夹下ImageIO.write(imRes,"PNG",new File("result.png"));//最后保存图片类型为png}catch(IOException e){//否则抛出异常e.printStackTrace();}}public static void main(String[] args) {Main d=new Main();d.readOriginal();d.dither();}
}

有序抖动中我们还是以这张图片作为原灰度图像

在程序执行之后,得到的有序抖动之后的图像为

简单说明:
这2个程序我都是在idea上运行的,在Eclipse上运行不知道会不会出问题,对于学生来说是可以免费使用idea的,可以参考这篇 https://blog.csdn.net/xiatutut/article/details/126632928 ,但如果不是学生的话,如果用eclipse出问题,只能查问题原因或者用idea。

图像抖动(加入随机噪声+矩阵有序抖动)Java实现,不使用OpenCV 按照课堂中讲的两种抖动(Dithering)方法,自己编程实现(编程语言不限)。实现方法一:以加入随机噪声的方式保留信息相关推荐

  1. java 类隔离_微服务架构中zuul的两种隔离机制实验

    ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常.查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100 ...

  2. java声明异常必须抛出吗_简述java中抛出异常的两种方式

    java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看 ...

  3. java中super_java中super的两种用法

    转自:http://blog.csdn.net/yihuei123/archive/2007/06/04/1637893.aspx 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种 ...

  4. (转载)java中super的两种用法

    (转载)http://www.cnblogs.com/rollenholt/articles/2033989.html 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说 ...

  5. 宇宙中至少有两种方式能灭绝人类,第一种仅需两秒

    来源:科学的乐园 在科幻小说<三体Ⅲ:死神永生>之中,歌者文明"母世界"的宇宙飞船曾经利用宇宙规律武器二向箔来摧毁地球文明,将地球所处的三维世界完全变成了一个二维世界. ...

  6. java.net.MalformedURLException: unknown protocol: c 这个错一般有两种原因导致: 1、URL协议、格式或者路径错误,...

    java.net.MalformedURLException: unknown protocol: c这个错一般有两种原因导致:1.URL协议.格式或者路径错误, 好好检查下你程序中的代码如果是路径问 ...

  7. java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数。另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码。

    java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数.另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码. 具 ...

  8. PCBA加工中常见的两种焊接方式详解

    PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...

  9. Android中保存图片的两种方式

    Android中保存图片的两种方式 第一种是保存到数据库: 1.保存到数据库: 2.从数据库读取: 二是以图片格式保存到本地 1. A.声明tempFile以保存到指定路径: B.保存到tempFil ...

最新文章

  1. django手机访问_在手机上运行Python的神器
  2. 机器学习中的数学(3)-模型组合(Model Combining)之Boosting与Gradient Boosting
  3. window 程序报错 自动重启_好程序员web前端教程之详解JavaScript严格模式
  4. 如何更新Jenkins作业发布config.xml
  5. Python中Turtle绘图函数-绘制时钟程序
  6. 目标检测第6步:YOLOv5(5.0)如何在Colab中训练自定义数据集?(更新时间:2022.3.22)
  7. jsp页面javascript没反应
  8. C++判断函数执行效率方法封装
  9. C++ STL 教程
  10. Java 中nextLine()方法没有执行直接跳过解决办法
  11. 深度学习:卷积神经网络CNN变体
  12. Python 画数学函数图像 matplotlib.pyplot
  13. 中国最令人崩溃的25个姓氏,排名第1位的,打死都想不到
  14. 如何阅读一本好书:APUE
  15. 英:最常用有用的英语口语900句
  16. 计算机毕业设计ssm民宿预定管理系统20sxh系统+程序+源码+lw+远程部署
  17. JAVA集合之Map集合遍历
  18. Pandas个人最强笔记
  19. 二维码的生成细节和原理
  20. 巴西柔术_成为组织柔术大师

热门文章

  1. 【C语言与汇编】简单学学C到汇编代码
  2. 云上“两地三中心”,中小企业都用得起的多保险灾备方案
  3. iOS 动画 - 从不会到熟练应用
  4. AWVS登录扫描与不登陆扫描详解
  5. 第九章 - 线程安全集合类
  6. Oculus Home启动不了 We're having trouble starting Oculus
  7. 【源码分析设计模式 5】Java I/O系统中的装饰器模式
  8. C#实现IVR(基于东进的语音卡)-5
  9. java 压缩解压密码zip_Java解压和压缩带密码的zip文件过程详解|chu
  10. 把jquery city-picker地区选择插件数据改成微信小程序省市地区数据一样(php代码抓取微信小程序地区数据)