图片渲染(图像编码原理)

根据图像编码原理初步给图片渲染(马赛克、油画风格等

图像的编码原理

图像是由一个个带有颜色的小格组成的,每个小格的颜色都是唯一的。一张图片的像素个数=长*宽。所以不难理解,为什么一张图片的像素(像素点个数)越高,图片就越清晰,因为图片的精密度更高。下图显示的是一个分辨率为 900 × \times × 600的图片。
在这里插入图片描述
而每个像素的颜色取值是通过RGB模式确定的,RGB色彩就是常说的光学三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色)。自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,因此也称为加色模式。R、G、B各自的取值都是0~255,用 8bit一个字节就可以存储。所以用int数据类型就可以把RGB所需三个字节存储起来,最后还剩一个字节可以添加额外的信息。然后通过相应的位移运算和与运算就可以获得所需的RGB分量。

// 0000 0000 1000 0000 1000 0000 1000 0000 = 8421504
             R         G         B 
int value = 8421504;
int red = (value >> 16) & 0xFF;
int green = (value >> 8) & 0xFF;
//0000 0000 1000 0000 1000 0000 1000 0000
//右移八位:  0000 0000 1000 0000 1000 0000
//                         0xFF: 1111 1111    
// 最后做与运算获得分量:green:     
int blue = (value >> 0) & 0xFF;

绘制图像

接下来就可以将图片的像素存储到二维数组里,
Image是一个抽象类,BufferedImage是其实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片)
流程如下:

1.首先根据提供的图片路径path创建一个文件对象
String path="E:\\java\\eclipse\\eclipse javaee\\workspace\\Yu java\\66.jpg"
File file =new File(path);//java.io.File
2.再次具体化file是什么类型的文件,
  以便于调用不同类型文件所具有的不同方法,这里是image文件
  那么就可以调用getRGB(i, j)来获取像素。
  //读取文件数据
  //java.awt.image.BufferedImage;
  BufferedImage buffimage=null;
 try {
	 buffimage=ImageIO.read(file);//javax.imageio.ImageIO
	 }catch (IOException e) {
	 e.printStackTrace();
	 System.err.println("图像读取失败");
	                           }
3.通过循环将buffimage.getRGB(i, j)获得像素存放在数组中  

详细实现如下:

//读取文件,获得图片像素
	public int[][] getImagePixel(String path) 
	{
		//读取文件的数据
		File file =new File(path);
		//imageIO操作将图片文件的输入输出,
		//读取文件数据
		BufferedImage buffimage=null;
		try {
		   buffimage=ImageIO.read(file);
	       }catch (IOException e) {
		     e.printStackTrace();
		     System.err.println("图像读取失败");
	                              }
	    //获取缓冲图片的大小,初始化保存像素值得二维数组		
		int w=buffimage.getWidth();
		int h=buffimage.getHeight();
	    int [][]arrPixel=new int[w][h];
		for(int i=0;i<w;i++)
		{
			for(int j=0;j<h;j++)
			{
				int pixel=buffimage.getRGB(i, j);
				arrPixel[i][j]=pixel;
			}
		}
		return arrPixel;

	}

在这里插入图片描述
以上是原图重绘效果。除此之外,根据像素的重绘间隔和色彩RGB设置我们可以获得不同的图片渲染效果。例如:马赛克(间隔取像素,不一个一个重绘),二值化(根据计算出来的灰度值定一个阈值 100 ,大于画白, 小于画黑色)。

//马赛克 间距取像素值 绘制成间距大小的方块
public void paint2(Graphics g,String path)
{
	int [][]arrpixel=getImagePixel(path);
	for(int i=0;i<arrpixel.length;i+=20)
	{
	  for(int j=0;j<arrpixel[i].length;j+=20)
	  {   
		  int pixel=arrpixel[i][j];
		  int red=(pixel>>16&0xFF);
		  int green=(pixel>>8&0xFF);
		  int blue =(pixel>>0&0xFF);
		  Color color=new Color(red,green,blue);
		  g.setColor(color);
		  g.fillRect(i, j+200, 20,20);
	       
	  }
	}
	
}


//灰度
public void paint3(Graphics g ,String path)
{
	int [][]pixel=getImagePixel(path);
	for(int i=0;i<pixel.length;i++)
	{
		for(int j=0;j<pixel[i].length;j++)
		{
			int value =pixel[i][j];
			int red=(value>>16)&0xFF;
		    int green=(value>>8)&0xFF;
		    int blue=(value>>0)&0xFF;
		    int gray =(red+green+blue)/3;
		   // int gray =(int)(red*0.4+green*0.28+blue*0.31); 		
		   //Color color=new Color(red/2,green/2,blue/2);
		    Color color=new Color(gray,gray,gray);
		    g.setColor(color);
		    g.fillRect(i,j+200,1,1);
		}
	}
}

//二值化手绘
public void paint4(Graphics g ,String path)
{
	int [][]pixel=getImagePixel(path);
	for(int i=0;i<pixel.length;i++)
	{
		for(int j=0;j<pixel[i].length;j++)
		{
			int value =pixel[i][j];
			int red=(value>>16)&0xFF;
		    int green=(value>>8)&0xFF;
		    int blue=(value>>0)&0xFF;
		    int gray=(int)(red*0.4+green*0.5+blue*0.6);
		    //以gray<100为分界线,大于这个数的全部是白色
		    if(gray<150)
		    {
		    	g.setColor(Color.black);
		    }
		    else
		    {
		    	g.setColor(Color.white);
		    }
		    g.fillRect(i, j+200,1, 1);
		}
	}
}

//轮廓检测
//相邻之间的像素点进行比较
public void paint5(Graphics g ,String path)
{
	int [][]pixel=getImagePixel(path);
	for(int i=0;i<pixel.length-2;i++)
	{
		for(int j=0;j<pixel[i].length-2;j++)
		{
			int value =pixel[i][j];
			int red=(value>>16)&0xFF;
		    int green=(value>>8)&0xFF;
		    int blue=(value>>0)&0xFF;
		    
		    int valuen=pixel[i+2][j+2];
		    int redn=(valuen>>16)&0xFF;
		    int greenn=(valuen>>8)&0xFF;
		    int bluen=(valuen>>0)&0xFF;
           //int gray =(red+green+blue)/3;
           int gray =(int)(red*0.41+green*0.28+blue*0.31);
            int grayn =(int)(redn*0.41+greenn*0.28+bluen*0.31);
            
            if(Math.abs(gray-grayn)>15){
                g.setColor(Color.PINK);
            }else{
                g.setColor(Color.white);
            }
		    g.fillRect(i, j+200, 1, 1);
		    
		}
	}
}
//绘制油画
public void paint6(Graphics g ,String path)
{
	Random random = new Random();
	int [][]pixel=getImagePixel(path);
	for(int i=0;i<pixel.length;i+=3)
	{
		for(int j=0;j<pixel[i].length;j+=3)
		{
			Color color=new Color(pixel[i][j]);
			g.setColor(color);
		    int size = random.nextInt(5)+5; 
		    g.fillOval(i,j+200,size,size);
		}
	}
}

马赛克
在这里插入图片描述
灰度
在这里插入图片描述
二值化
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 全息干涉图仿真计算机是一种基于全息干涉原理的计算机。全息干涉图是一种通过将两个光束交叉,使它们产生干涉产物的光学图像。这个干涉图可以记录在一块光敏材料上,形成一张全息干涉图。 全息干涉图仿真计算机的原理是利用全息干涉图中的干涉条纹来实现计算。干涉条纹的位置和形状与干涉光的相位差有关,因此可以通过改变干涉光的相位差来改变干涉条纹的位置和形状。利用这个原理,可以将干涉条纹作为计算结果,通过光学处理来实现计算。 全息干涉图仿真计算机的优点是可以实现并行计算。在一张全息干涉图中,可以记录多个干涉条纹,因此可以同时处理多个计算任务。此外,由于全息干涉图可以记录在光敏材料中,因此可以实现非常高的存储密度。 然而,全息干涉图仿真计算机的缺点也很明显。首先,它需要非常高质量的光学元件,以确保干涉条纹的清晰度和稳定性。其次,全息干涉图的制备过程比较复杂,需要精密的光学实验技术。最后,全息干涉图仿真计算机的计算速度较慢,因为它需要通过光学处理来实现计算。 ### 回答2: 全息干涉图仿真计算机原理是利用计算机对全息干涉图像进行模拟和计算的过程。全息干涉图是指通过干涉光学原理,将物体的三维信息编码在光的波前上,形成的干涉图像。仿真计算机通过模拟和计算这些干涉图像,可以还原出物体的形状、颜色和材质等信息。 全息干涉图仿真计算机的原理主要包括以下几个步骤: 首先,将物体的三维信息转化为数字信号。这一步可以通过使用3D扫描仪或摄像机等设备,将物体的表面形状进行扫描,然后将扫描到的数据转换为数字信号。 其次,将数字信号转化为光学信号。这一步骤需要使用计算机将数字信号转换为光学信号,可以通过数码渲染技术和数码投影技术实现。 然后,对光学信号进行干涉计算。这一步骤是仿真计算机对全息干涉图的核心操作,通过对输入光学信号进行干涉和计算,得到全息干涉图像的输出结果。 最后,通过光电转换器将全息干涉图像转换为可见光信号。这一步骤使用光电转换器将光学信号转化为人眼可见的图像,使得人们可以观察和分析全息干涉图像。 全息干涉图仿真计算机原理的应用非常广泛。例如,在三维建模、虚拟现实、医学影像处理等领域中,可以通过全息干涉图仿真计算机实现实时的、高精度的图像处理和分析,从而提高工作效率和数据处理精度。此外,全息干涉图仿真计算机还可以应用于安全验证和防伪检测等领域,通过对物体表面的全息干涉图像进行计算和比对,实现物体的身份验证和真伪检测。 ### 回答3: 全息干涉图仿真计算机是一种基于全息干涉原理进行仿真计算的设备。全息干涉原理是指当两束相干光线交叠在一起时,会产生干涉现象。通过将光场信息记录在全息图中,再将全息图进行可逆读取和恢复,我们可以实现对光场的重建和仿真计算。 全息干涉图仿真计算机的原理可以简述为以下几个步骤: 首先,利用激光光源产生相干光束,将其中一束光作为参考光,另一束光作为被测光。 然后,将参考光和被测光通过一个分束镜进行分束。被测光经过待测物体后携带了物体的光场信息,而参考光则保持原有的相干性。 接下来,被测光和参考光在全息介质上进行干涉。全息介质有可能是一片光敏材料,比如全息胶片,或者是一块涂有光敏物质的晶体。 干涉之后,全息图就记录了被测光和参考光的干涉图样,即相干光束的干涉图样。 最后,当需要重建和模拟光场时,用读取装置对全息图进行可逆读取。全息图读取后,会通过再次照射参考光束的方式来恢复被测光的信息。 通过读取和恢复的过程,全息干涉图仿真计算机可以实现对光场的重建、模拟和计算。这种计算机能够模拟光学系统中的真实光场,对光学器件的性能进行评估,以及进行光学算法的仿真。 总之,全息干涉图仿真计算机通过记录和读取全息图,可以实现对光场的重建和仿真计算,为光学系统设计和光学算法研究提供了一种重要工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuochaoHN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值