一、项目结构概述
本项目包含两个核心类,实现了图像的二值化处理和简易可视化功能:
1. ImageProcess.java(核心处理类)
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class ImageProcess {
Graphics g;
public int[][] getImageArr(String path) {
File file = new File(path);
try {
BufferedImage img = ImageIO.read(file);
int w = img.getWidth();
int h = img.getHeight();
int[][] arr = new int[w][h];
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
arr[i][j] = img.getRGB(i, j);
}
}
return arr;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String processImage(int[][] arr) {
if (arr == null || arr.length == 0 || arr[0].length == 0) {
return "";
}
// ... 原逻辑 ...
int w = arr.length;
int h = arr[0].length;
int bit = 128;
// w = w - w % bit;
// h = h - h * bit;
int bi = w / bit;
int bj = h / bit;
int n = 0, m = 0;
String imgBinCode = "";
for (int i = 0; i < w; i++) {
n++;
m = 0;
for (int j = 0; j < h; j++) {
m++;
int pixNum = arr[i][j];
Color color = new Color(pixNum);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int gray = (red + green + blue) / 3;
if (gray > 128) {
gray = 255;
imgBinCode += "1";
} else {
gray = 0;
imgBinCode += "0";
}
// g.setColor(color);
// g.fillRect((100 + i / bi), (200 + j / bj), 1, 1);
}
imgBinCode += "\n";
}
// System.out.println("n = "+n);
// System.out.println("m = "+m);
// System.out.println("imageBinCode = "+imgBinCode);
return imgBinCode;
}
public static void main(String[] args) {
ArrayList<String> fileList = new ArrayList<>();
ArrayList<String> imgBinCodesList = new ArrayList<>();
ImageProcess ip = new ImageProcess();
File file = new File("N:\\Lagerstromia\\ZBasic\\imgsflower");
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
File f1 = files[i];
System.out.println(f1.getAbsolutePath());
File[] imgFiles = f1.listFiles();
if (imgFiles != null) {
for (int j = 0; j < imgFiles.length; j++) {
File imgFile = imgFiles[j];
System.out.println(imgFile.getName());
if (f1.isFile() && f1.getName().toLowerCase().endsWith(".jpg")) {
int[][] imageArr = ip.getImageArr(imgFile.getAbsolutePath());
String imgBinCode = ip.processImage(imageArr);
fileList.add(imgFile.getName());
imgBinCodesList.add(imgBinCode);
}
}
}
}
int[][] imageArr = ip.getImageArr("N:\\Lagerstromia\\ZBasic\\imgsflower\\0008.jpg");
String exmCode = ip.processImage(imageArr);
System.out.println("exmCode 长度: " + exmCode.length());
ArrayList<Integer> countList = new ArrayList<>();
for (int i = 0; i < imgBinCodesList.size(); i++) {
int count = 0;
String binCode = imgBinCodesList.get(i);
// System.out.println("exmCode 长度: " + exmCode.length());
for (int j = 0; j < exmCode.length(); j++) {
char c1 = exmCode.charAt(j);
char c2 = binCode.charAt(j);
if (c1 != c2) {
System.out.println("文件名: " + fileList.get(i));
count++;
break;
}
}
countList.add(count);
}
// 主循环结束后
System.out.println("已处理的图片数量: " + imgBinCodesList.size());
System.out.println("countList大小 " + countList.size());
System.out.println("imgBinCodesList 大小: " + imgBinCodesList.size());
System.out.println("fileList 大小: " + fileList.size());
for (int i = 0; i < countList.size(); i++) {
System.out.println("文件名 " + fileList.get(i) + " 相似度差值 " + countList.get(i));
}
}
}
2. ImageUI.java(可视化界面类)
import javax.swing.*;
import java.awt.*;
public class ImageUI extends JFrame {
ImageProcess ip = new ImageProcess();
public void showUI(){
setTitle("图片处理机制");
setSize(800,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
ip.g = getGraphics();
}
public void paint(Graphics g){
super.paint(g);
int[][] arr = ip.getImageArr
("N:\\Lagerstromia\\ZBasic\\imgsflower\\0010.jpg");
ip.processImage(arr);
}
public static void main(String[] args) {
ImageUI ui = new ImageUI();
ui.showUI();
}
}
二、核心功能解析
1. 图像读取与矩阵转换
getImageArr()
方法实现图像到二维数组的转换:
-
使用
ImageIO.read()
读取图片文件 -
遍历每个像素获取RGB值
-
存储为
int[w][h]
二维数组
2. 二值化处理算法
processImage()
方法核心逻辑:
// 二值化处理代码片段
int gray = (red + green + blue) / 3;
if (gray > 128) {
gray = 255;
imgBinCode += "1";
} else {
gray = 0;
imgBinCode += "0";
}
-
灰度计算:RGB平均值法
-
阈值分割:128为临界值
-
生成二进制字符串表示(1白/0黑)
3. 图像相似度对比
main()
方法实现特性:
-
遍历指定目录的图片文件
-
生成所有图片的二值化编码
-
通过字符对比计算差异度
-
输出相似度统计结果
4. 可视化界面
ImageUI
类特性:
-
继承JFrame创建窗口程序
-
使用
paint()
方法进行图像重绘 -
集成ImageProcess处理流程
-
基础图形界面展示