Java如何实现图像的卷积效果

 更新时间:2024年03月25日 09:52:23   作者:feng之锋  
这篇文章主要介绍了Java如何实现图像的卷积效果问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

图像的卷积

指的是使用一个卷积核(kernel)对图像中的每一个像素进行一些列操作。

卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是于原图像做运算的参数。

卷积核通常是一个方形的网格结构,该区域上的每一个方格都有一个权重值,

如下图,利用一个3 * 3的卷积核与图像上的相应大小的区域进行卷积运算,即对应相乘再相加,0*4+0*0+0*0+0*0+0*1+1*0+0*0+1*0+2*(-4)=-8.

Java中实现的效果

主类:

package com.yf1105;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;


public class DrawF {
	public static void main(String[] args) {
		DrawF drawpanel = new DrawF();
		drawpanel.showUI();
		
	}
	
	public void showUI() {
		JFrame jf = new JFrame();
		jf.setTitle("图片");
		jf.setSize(800, 800);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setLayout(new FlowLayout());
		jf.setLocationRelativeTo(null);
		
		jf.setVisible(true);
		
		//获取画笔一定要在可见之后
		Graphics g = jf.getGraphics();
		//添加监听器
		DrawListener mouse = new DrawListener();
		jf.addMouseListener(mouse);
		//将主类中的画笔传给监听器类中去
		mouse.g = g;
	}
}

监听类:

package com.yf1105;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class DrawListener implements MouseListener{
	Graphics g;
	
	public int[][] getImagePixel(String path){
		File file = new File(path);
		
		BufferedImage bufferImage = null;
		try {
			bufferImage = ImageIO.read(file);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			
		}
		
		int w = bufferImage.getWidth();
		int h = bufferImage.getHeight();
		
		int [][] pixelArray = new int[w][h];
		
		for(int i = 0; i < w; i++) {
			for(int j = 0; j < h; j++) {
				//读取每个位置的像素点对应的RGB值
				int pixel = bufferImage.getRGB(i, j);
				pixelArray[i][j] = pixel;
			}
		}
		return pixelArray;
		
	}
	
	//在界面上画出ia数组图像,即卷积结果
	public void drawjj(Graphics g) {
		int[][] ia = getImagePixel("image/3.jpg");
		ia = valide(ia, kArray);
		for(int i = 0; i<ia.length; i++) {
			for(int j = 0; j<ia[0].length; j++) {
				int pie = ia[i][j];
				Color color = new Color(pie,pie,pie);
				g.setColor(color);
				g.fillRect(i, j, 1, 1);
			}
		}
		
	}
	
	//卷积核
	float[][] kArray = {{-1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1}, {-1, -1, 25, -1, -1}, {-1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1}};
	
	
	//实现卷积操作
	public static int[][] valide(int[][] src, float[][] filter){
		int[][] tem = new int[filter.length][filter[0].length];
		int valideWidth = src[0].length - filter[0].length;
		int valideHeigth = src.length - filter.length + 1;
		int[][] valide = new int[valideHeigth][valideWidth];
		
		for(int i = 0; i<valideHeigth; i++) {
			for(int j = 0; j<valideWidth; j++) {
				for(int y = 0; y<filter.length; y++) {
					for(int z = 0; z<filter[0].length; z++ ) {
						tem[y][z] = (int)((src[i+y][j+z])*filter[y][z]); 
					}
				}
				int kk = 0;
				for(int y = 0; y<filter.length; y++) {
					for(int z = 0; z<filter[0].length; z++) {
						kk += tem[y][z];
					}
				}
				if(kk<0)kk=0;
				if(kk>255)kk=255;
				valide[i][j] = kk;
				
				}
			}
			return valide;
		}
		
	
	public void mouseClicked(MouseEvent e) {
		System.out.println("点击");
		drawjj(g);
		
		
	}
	
	public void mousePressed(MouseEvent e) {}
	
	public void mouseReleased(MouseEvent e) {}
	
	public void mouseEntered(MouseEvent e) {}
	
	public void mouseExited(MouseEvent e) {}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 分析java 中AspectJ切面执行两次的原因

    分析java 中AspectJ切面执行两次的原因

    这篇文章主要介绍了分析java 中AspectJ切面执行两次的原因的相关资料,希望通过本能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Java中BigDecimal类的add()的使用详解

    Java中BigDecimal类的add()的使用详解

    这篇文章主要介绍了Java中BigDecimal类的add()的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • springboot中使用@Transactional注解事物不生效的坑

    springboot中使用@Transactional注解事物不生效的坑

    这篇文章主要介绍了springboot中使用@Transactional注解事物不生效的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • java实现cassandra高级操作之分页实例(有项目具体需求)

    java实现cassandra高级操作之分页实例(有项目具体需求)

    这篇文章主要介绍了java实现cassandra高级操作之分页实例(有项目具体需求),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • java实现选课系统

    java实现选课系统

    这篇文章主要为大家详细介绍了java实现选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • java实现多设备同时登录或强制下线

    java实现多设备同时登录或强制下线

    本文主要介绍了java实现多设备同时登录或强制下线,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java算法实战之排一亿个随机数

    Java算法实战之排一亿个随机数

    我们在生活中经常遇见一些这样的需求,随机点名、公司年会抽奖、微信拼手气红包等,还有一些游戏比如打地鼠小游戏、俄罗斯方块等,这些场景中都会用到一种算法:随机,这篇文章主要给大家介绍了关于Java算法实战之排一亿个随机数的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java面试题冲刺第二十八天--数据库(5)

    Java面试题冲刺第二十八天--数据库(5)

    这篇文章主要为大家分享了最有价值的三道关于数据库的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • MyBatis快速入门(简明浅析易懂)

    MyBatis快速入门(简明浅析易懂)

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。mybatis的学习是程序员的必修课。今天小编通过分享本教程帮助大家快速入门mybatis,对mybatis入门知识感兴趣的朋友参考下吧
    2016-11-11
  • Spring依赖注入和控制反转详情

    Spring依赖注入和控制反转详情

    这篇文章主要介绍了Spring依赖注入和控制反转详情,控制反转是面向对象编程中使用的术语,通过该术语,对象或对象集的控制权被赋予框架或由框架提供的容器。下文更多相关内容需要的小伙伴可以参考一下
    2022-05-05

最新评论