IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> java图像处理,画几个抽象派图片,一个简单的调色板可还行 -> 正文阅读

[人工智能]java图像处理,画几个抽象派图片,一个简单的调色板可还行

图像处理

画马赛克之前先来点知识储备

图像原理:

像素 :是由图像的小方格组成的,每一个小方块都有一个明显的位置和被分配的色彩数值,小方格的颜色和位置就决定该图像所呈现出来的样子(以上来自科普中国)。
分辨率:每英寸上的像素数量,单位时DPI。像素相同时,分辨率越高,则像素密度越大,实际打印的尺寸越小,图像也就越清晰。
RGB颜色模型:是一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以合成产生各种色彩光,共有256256256种颜色。
灰度图像:指r,g,b三个分量都相同,一般取平均值进行处理。
像素矩阵:对于一幅图像,可以把它看成一个二维数组(图像=[i][j]),对于每一个int值,就是这个点的像素值。
所以,图像处理的本质其实就是对代表图像的二维数组中的值进行处理

像素值的存储

我们知道,其实计算机都是用二进制数处理数据的,int类型有32位,byte是8位,每种原色的数量正好是一个8位,所以我们把像素值存储在一个int类型的数据中。
0000 0000 24~32位
0000 0000 16~24位,用来存储red的值
0000 0000 8~16位 ,用来存储green的值
0000 0000 0~8位,用来存储blue的值
那具体怎么存取呢?这里要用到移位操作符和位运算操作符:

移位操作符

左移 << (低位补0);右移 >>(符号位不变)

位运算操作符

&:位与,“相同保留,不同为1”;
|:位或,“只有都为0时才为0”;

取数据

将二进制数据移动相应的位数,然后只取第八位的数值就可以了。如何做到只取低八位的数呢?
对0xFF(低八位全为1的数)进行位与运算。

int red=(rgb >> 16) & 0xFF;//取红色
int green=(rgb >> 8) & 0xFF;//取绿色
int blue=(rgb >> 0) & 0xFF;//取蓝色

存数据

int rgb=  ((225 & 0xFF<< 24 | //不透明
           (red & 0xFF) << 16 | 
           (green & 0xFF)<< 8 | 
           (blue & 0xFF) << 0);

接下来我们就画一个马赛克吧!

package Paint0924;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
//继承JFrame
public class Paint extends JFrame{
	public static void main(String[] args) {
		Paint p=new Paint();
		p.UI();
	}
	public void UI() {
	//创建一个简单的界面
		this.setTitle("mosaic");
		this.setSize(700,500);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		this.setVisible(true);
	}
	
	public void paint(Graphics g) {
		super.paint(g);
		System.out.println("开始画图");
		
		//创建一个二维数组来保存数据
		int color[][]=new int[700][500];
		//存储数据
		//随机数
		Random ra=new Random();
		for(int i=0;i<700;i+=25) {
			for(int j=0;j<500;j+=25) {
				int red=ra.nextInt(256);//范围是区间[0,256)
				int green=ra.nextInt(256);
				int blue=ra.nextInt(256);
				int value=((255 & 0xFF)<<24 | 
						   (red & 0xFF)<<16 |
						   (green & 0xFF)<<8 |
						   (blue & 0xFF)<<0);
				color[i][j]=value;
	
						}
		}
		
		//灰度处理   马赛克
		//遍历数组
		for(int i=0;i<700;i+=25) {
			for(int j=0;j<500;j+=25) {
				int value=color[i][j];
				int red=(value>>16) & 0xFF;
				int green=(value>>8) & 0xFF;
				int blue=(value>>0) & 0xFF;
				//灰度处理,取平均数
				int gray=(red+green+blue)/3;
				System.out.println(gray);
				Color co2=new Color(gray,gray,gray);
				g.setColor(co2);
				g.fillRect(i, j, 25, 25);
			}
		}	
	}
}

程序运行效果如下:
在这里插入图片描述
另外,我们还可以画一些比较有意思的图片,比如,只要在遍历数组那儿稍微改动一下

for(int i=0;i<700;i+=2) {
			for(int j=0;j<500;j+=2) {
				Color co=new Color(color[i][j]);
				g.setColor(co);
				g.fillRect(i, j, 2, 2);
			}
		}

图片就会是:
在这里插入图片描述

我们来尝试一下做一个简单的调色板
代码及思路如下

public class Palette {
	public static void main(String[] args) {
		Palette p=new Palette();
		p.UI();
	}
	//创建一个内部类
	 class Colorchange implements ChangeListener,MouseListener{
		//重写所有方法
		    public void mousePressed(MouseEvent e) {
		        //用来获取整数值的
		    	int R=Integer.parseInt(red.getText());
				int G=Integer.parseInt(green.getText());
				int B=Integer.parseInt(blue.getText());
				//改变滑块内容
				s1.setValue(R);
				s2.setValue(G);
				s3.setValue(B);
		    }
		    public void stateChanged(ChangeEvent e) {
			 	int R=s1.getValue();
				int G=s2.getValue();
				int B=s3.getValue();
				j.setBackground(new Color(R,G,B));
			
		 }
		    public void mouseClicked(MouseEvent e) {}
		    public void mouseReleased(MouseEvent e) {}
		    public void mouseEntered(MouseEvent e) {}
		    public void mouseExited(MouseEvent e) {}	
	 }
		

	
	 		//创建面板
			JPanel jp1=new JPanel();
			
			//创建三个标签
			JLabel j1=new JLabel("R");
			JLabel j2=new JLabel("G");
			JLabel j3=new JLabel("B");
			
			//创建三个文字框记录rgb的值
			JTextField red=new JTextField();
			JTextField green=new JTextField();
			JTextField blue=new JTextField();
			
			//创建三个滑块
			JSlider s1=new JSlider();
			JSlider s2=new JSlider();
			JSlider s3=new JSlider();
			
			//创建窗体和按钮(用来显示颜色)
			JButton j=new JButton();
			JFrame jf=new JFrame();	
			
	public void UI() {
		jf.setTitle("color_palette");
		jf.setSize(700,500);
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(3);
		jf.setLayout(null);
		
		//给滑块设置最大值
		s1.setMaximum(255);
		s2.setMaximum(255);
		s3.setMaximum(255);

		//给滑块加上监听器
		Colorchange c=new Colorchange();
		s1.addChangeListener(c);
		s2.addChangeListener(c);
		s3.addChangeListener(c);

		//给rgb的值加上MouseListener监听器
				red.addMouseListener(c);
				green.addMouseListener(c);
				blue.addMouseListener(c);
				
		//把三个标签和三个滑块都添加到面板1上
		jp1.add(j1);
		jp1.add(s1);
		jp1.add(j2);
		jp1.add(s2);
		jp1.add(j3);
		jp1.add(s3);
		
		//设置按钮的位置和大小
		j.setBounds(0, 100, 700, 400);
		jp1.setBounds(0, 0, 700, 100);
		
		//把面板放到窗体上
		jf.add(jp1);
		jf.add(j);
		
		jf.setVisible(true);
	}		
}

程序运行结果如下:
在这里插入图片描述

界面有点丑哈~

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:10:08  更:2021-09-26 10:11:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 12:50:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码