Java图像二值化处理与简易UI实现

一、项目结构概述

本项目包含两个核心类,实现了图像的二值化处理和简易可视化功能:

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处理流程

  • 基础图形界面展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值