卷积图像算法

简介

卷积: 适用于图像,音频识别,信号处理等
方法:使用两个二维数组,让这两个数组对位相乘,然后相加所有的值
数组1: 图像矩阵,比较大
数组2: 卷积核/滤波器,比较小,尺寸有33,55,77,99,11*11 …请添加图片描述

卷积核

请添加图片描述

卷积处理时要拆分RGB

颜色值是一个整数
拆分为 R G B
R 的像素矩阵 与 卷积核 卷积计算的结果与
G 的像素矩阵 与 卷积核 卷积计算的结果 与
B 的像素矩阵 与 卷积核 卷积计算 合成一个颜色值
合成之前必须做边界判断

数字识别

请添加图片描述
请添加图片描述

示例代码

ui部分

package com.lqj220325;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileNameExtensionFilter;

public class UI extends JFrame{
	
	public static void main(String[] args) {
		
		new UI().jiemian();
	
	}

	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		int [][] karr= {
				{-1,0,-1},
				{0,5,0},
				{-1,0,-1}
		};

		File file =new File("/Users/cater/Documents/JAVA/project/src/com/lqj220123/1.png");
//		JFileChooser jfc =new JFileChooser();
//		FileNameExtensionFilter filter =
//				new FileNameExtensionFilter
//				("图片文件(jpg、png、jpeg、gif、bmp、heic)","jpg","png","jpeg","gif","bmp","heic");
//		jfc.setFileFilter(filter);
//		jfc.showOpenDialog(null);
//		File file =jfc.getSelectedFile();
		BufferedImage image=null;
		try {
			 image =ImageIO.read(file);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		int[][] imgarr =new int[image.getWidth()][image.getHeight()];
		for(int i=0;i<image.getWidth();i++) {
	    	for(int j=0;j<image.getHeight();j++) {
	    		imgarr[i][j]=image.getRGB(i, j);	
	    	}
	    }
	int[][] ints=	new convolution().darwImage(karr, imgarr);
	BufferedImage newimage=new BufferedImage(ints.length,ints[0].length,BufferedImage.TYPE_INT_ARGB);
	for(int i=0;i<ints.length;i++) {
    	for(int j=0;j<ints[i].length;j++) {
    		newimage.setRGB(i, j, ints[i][j]);
    	}
    }
		g.drawImage(newimage, 0, 0, null);
	}
	
	public void jiemian() {
		UI ui =new UI();
		
		ui.setTitle ("卷积图像处理");
		ui.setVisible(true);
        ui.setSize (800,600);
        ui.setDefaultCloseOperation (EXIT_ON_CLOSE);   
	}

}

卷积处理部分

package com.lqj220325;

public class convolution {

	
	
	public int[][] darwImage(int[][] karr,int[][] imgarr) {
		int[][] newimgarr =new int[imgarr.length][imgarr[0].length];
		int w=imgarr.length-karr.length;
		int h=imgarr[0].length-karr[0].length;
		for(int i=0;i<w;i++) {
			for(int j=0;j<h;j++) {
			    int newrgb=0;
			    int nr=0;
			    int nb=0;
			    int ng=0;
				for(int k=0;k<karr.length;k++) {
					for(int l=0;l<karr[k].length;l++) {
						int rgbvalue =imgarr[i+k][j+l];
						
						int red=(rgbvalue>>16)&0xFF;
						int green=(rgbvalue>>8)&0xFF;
						int blue=(rgbvalue>>0)&0xFF;
						
						int ansred=red*karr[k][l];
						int ansgreen=green*karr[k][l];
						int ansblue=blue*karr[k][l];
						 
						nr+=ansred;
						ng+=ansgreen;
						nb+=ansblue;
						
					}
				}
				//颜色范围限定
				if(nr>255) {
					nr=255;
				}
				if(nr<0) {
					nr=0;
				}
				if(nb>255) {
					nb=255;
				}
				if(nb<0) {
					nb=0;
				}
				if(ng>255) {
					ng=255;
				}
				if(ng<0) {
					ng=0;
				}
				//防止越界(不超过255)把值和255相与,大于255最后结果是255,小于255保留值
				int value =((255 & 0xFF)<<24) |
						((nr & 0xFF)<<16) |
						((ng & 0xFF)<<8) |
						((nb & 0xFF)<<0) ;
				
				
				
				
				newimgarr[i+karr.length/2][j+karr[0].length/2]=value;
				
				
				
				
			}
					
		
		
	}
return newimgarr;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值