简介
卷积: 适用于图像,音频识别,信号处理等
方法:使用两个二维数组,让这两个数组对位相乘,然后相加所有的值
数组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;
}
}