当前位置: 首页 > news >正文

图像处理原理

本文以显示本地图片为例,讲解图像处理的基本原理。

要导入本地图片,需要使用IO(输入/输出)接口。通过IO接口可以实现外部数据与程序内存之间的数据传输。我们将使用javax.imageio包中的ImageIO工具类来完成这一操作。

首先需要创建可视化界面:基于JFrame类创建JPanel面板,并添加"原图"和"灰度"两个功能按钮。

package Pixel;import javax.swing.*;import java.awt.*;public class PixelUI{publicvoidinitUI(){JFrame jf=newJFrame();jf.setTitle("图像处理");jf.setSize(900,900);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(3);jf.setLayout(newFlowLayout());JPanel panel=newJPanel();//创建按钮面板JButton jbu=newJButton("原图");panel.add(jbu);//按钮添加进JPanel面板JButton gray=newJButton("灰度");panel.add(gray);jf.add(panel);//按钮面板添加进JFramejf.setVisible(true);Graphics g=jf.getGraphics();//监听器PixelListener listener=newPixelListener();jbu.addActionListener(listener);//按钮添加监听器listener.g=g;gray.addActionListener(listener);}publicstaticvoidmain(String[]args){PixelUI ui=newPixelUI();ui.initUI();}}

创建PixelListener类,定义public Graphics g属性用于与PixelUI类交互。先考虑实现本地图片显示功能,通过File对象传递图片路径。

String path="E:\\IdeaProjects\\Java02\\src\\Pixel\\比尔盖茨.png";File file=newFile(path);//传递图片

接着定义数组读取图片内容:

int[][]pixelArr=getImagePixel(file);//读取drawPixel(greyArr);//绘制原图

先通过二维数组获得图片内容,两层for循环遍历图片的高和宽,这里用到RGB三原色的定义,bufferdImag.getRGB(j,i)返回int类型数值(占32位二进制)。三原色中每个元素的区间是八位二进制0-255,对应十六进制 0x00~0xFF。对应颜色右移即可显示对应颜色范围,但是右移,高位补1,要想不影响结果,用按位与运算符&0xFF。如图:

publicint[][]getImagePixel(File file){BufferedImage bufferdImage=null;try{bufferdImage=ImageIO.read(file);}catch(IOException e){throw newRuntimeException(e);}//根据图片大小定义二维数组存图片像素数intw=bufferdImage.getWidth();inth=bufferdImage.getHeight();int[][]pixelArr=newint[h][w];for(inti=0;i<h;i++){for(intj=0;j<w;j++){intrgb=bufferdImage.getRGB(j,i);pixelArr[i][j]=rgb;}}returnpixelArr;}

写drawPixel图片绘制逻辑:原理是绘制每个单像素点,还原像素点,需左移回getImagePixel()中右移的位数。再将像素值转化为Color对象,传给画笔进行绘制。

publicvoiddrawPixel(int[][]pixelArr){for(inti=0;i<pixelArr.length;i++){for(intj=0;j<pixelArr[0].length;j++){intrgb=pixelArr[i][j];//取RGB三原色intred=rgb>>16&0xFF;intgreen=rgb>>8&0xFF;intblue=rgb&0XFF;//传画笔Color color=newColor(red,green,blue);g.setColor(color);g.drawLine(j,i,j,i);//绘制像素点}}}

至于灰度功能,另建一方法getgrey,传入pixelArr原图参数。根据存原图数组大小确定灰度数组空间。两层for循环遍历高宽,计算出三原色后,取平均值。

publicint[][]getgrey(int[][]pixelArr){inth=pixelArr.length;intw=pixelArr[0].length;int[][]greyArr=newint[h][w];for(inti=0;i<h;i++){for(intj=0;j<w;j++){intrgb=pixelArr[i][j];intred=rgb>>16&0xFF;intgreen=rgb>>8&0xFF;intblue=rgb&0XFF;intgrey=(red+green+blue)/3;greyArr[i][j]=grey;}}returngreyArr;}

以下为效果展示:

本文涵盖了监听器绑定、面板创建、类对象与变量交互、RGB显示原理以及IO接口应用等内容,更好地认识了面向对象程序编程。

http://www.cnnetsun.cn/news/1352022.html

相关文章:

  • 伪真openclaw主动式智能体—告别‘巨婴’AI工具人:体验主动智能体的魅力
  • 第4节:CUDA实战——并行向量加法(从CPU到GPU的性能飞跃)
  • 揭秘RAG落地神器:OpenRAG快速构建智能知识库(干货满满),从零基础到实战,收藏这一篇就够了!
  • 全网唯一 霍奇猜想六级全域解构证明
  • 详解MySQL的limit关键字用法
  • 拓扑排序(Topological Sort)
  • 提示系统SQL优化从慢到快:架构师用提示工程实现查询响应速度提升10倍
  • Spring Boot 配置文件优先级机制
  • C++中的策略模式实战
  • 记一个BUG:Trae里MongoDB和MySQL MCP不能共存
  • vue根据数字显示对应的文字状态
  • 基于STM32F4的CANopen快速SDO通信(超级详细)
  • 【UART】Verilog实现UART接收和发送模块
  • 实战案例:使用混合推理打造高性能AI原生应用
  • VMware Horizon 8安装部署(一)AD域的安装
  • 主板STM32,GD32等MCU电路设计思维-状态提示
  • Qt 中多媒体模块的使用
  • 探索音乐创新:PedalinoMini™ —— 蓝牙WiFi MIDI控制器
  • 爬虫 APP 逆向 ---> 粉笔考研
  • AtomPePacker 开源项目教程
  • 北航论文格式零失误:BUAAthesis模板中图表、公式与代码块的规范使用
  • 从明文暴露到安全存储:Keyring彻底解决Python密码管理痛点
  • PDF4QT命令行工具详解:自动化处理PDF文档的实用技巧
  • java基于微信小程序的陕西省红色旅游管理系统_dkv6632x
  • leetcode153.寻找旋转排序数组中的最小值
  • MySQL数据库初体验
  • 【即插即用完整代码】CVPR 2026新方法归一化空间与通道注意力,无额外参数,轻量且高效,超越CBAM,快速涨点,发表论文!
  • BetterNCM 插件导致网易云音乐启动失败问题分析
  • Camera:实时监控与数据交互的智能设备服务
  • 事件日志清理与痕迹擦除:wmiexec-Pro的eventlog模块深度应用