Java如何實(shí)現(xiàn)圖像的卷積效果
圖像的卷積
指的是使用一個(gè)卷積核(kernel)對(duì)圖像中的每一個(gè)像素進(jìn)行一些列操作。
卷積核(算子)是用來做圖像處理時(shí)的矩陣,圖像處理時(shí)也稱為掩膜,是于原圖像做運(yùn)算的參數(shù)。
卷積核通常是一個(gè)方形的網(wǎng)格結(jié)構(gòu),該區(qū)域上的每一個(gè)方格都有一個(gè)權(quán)重值,
如下圖,利用一個(gè)3 * 3的卷積核與圖像上的相應(yīng)大小的區(qū)域進(jìn)行卷積運(yùn)算,即對(duì)應(yīng)相乘再相加,0*4+0*0+0*0+0*0+0*1+1*0+0*0+1*0+2*(-4)=-8.

Java中實(shí)現(xiàn)的效果
主類:
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();
//添加監(jiān)聽器
DrawListener mouse = new DrawListener();
jf.addMouseListener(mouse);
//將主類中的畫筆傳給監(jiān)聽器類中去
mouse.g = g;
}
}
監(jiān)聽類:
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++) {
//讀取每個(gè)位置的像素點(diǎn)對(duì)應(yīng)的RGB值
int pixel = bufferImage.getRGB(i, j);
pixelArray[i][j] = pixel;
}
}
return pixelArray;
}
//在界面上畫出ia數(shù)組圖像,即卷積結(jié)果
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}};
//實(shí)現(xiàn)卷積操作
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("點(diǎn)擊");
drawjj(g);
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java的Jackson庫中復(fù)雜對(duì)象集合的幾種簡(jiǎn)單轉(zhuǎn)換
本文主要介紹了Java的Jackson庫中復(fù)雜對(duì)象集合的幾種簡(jiǎn)單轉(zhuǎn)換。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02
Java使用CompletableFuture進(jìn)行非阻塞IO詳解
這篇文章主要介紹了Java使用CompletableFuture進(jìn)行非阻塞IO詳解,CompletableFuture是Java中的一個(gè)類,用于支持異步編程和處理異步任務(wù)的結(jié)果,它提供了一種方便的方式來處理異步操作,并允許我們以非阻塞的方式執(zhí)行任務(wù),需要的朋友可以參考下2023-09-09
mybatis動(dòng)態(tài)新增(insert)和修改(update)方式
這篇文章主要介紹了mybatis動(dòng)態(tài)新增(insert)和修改(update)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
springboot 配置文件配置項(xiàng)前綴為0的數(shù)字特殊處理方式
這篇文章主要介紹了springboot 配置文件配置項(xiàng)前綴為0的數(shù)字特殊處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
解決@Validated注解無效,嵌套對(duì)象屬性的@NotBlank無效問題
這篇文章主要介紹了解決@Validated注解無效,嵌套對(duì)象屬性的@NotBlank無效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

