首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 圖像處理實戰:BufferedImage 實現灰度化與二值化

     編輯:Java 相關知識

Java AWT/ImageIO 提供開箱即用的圖像處理能力,無需引入 OpenCV 等重型庫。本文演示如何用 BufferedImage 實現灰度化(TYPE_BYTE_GRAY)與二值化(TYPE_BYTE_BINARY),附完整代碼與效果對比圖。

核心思路

  1. 讀取原圖:ImageIO.read(File)
  2. 創建目標圖像:指定 BufferedImage.TYPE_BYTE_GRAY 或 TYPE_BYTE_BINARY
  3. 像素級複製:遍歷原圖 RGB,寫入目標圖(類型轉換由 JDK 內部自動完成)
  4. 輸出保存:ImageIO.write(image, "jpg", File)

完整代碼


package image;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageDemo {

    // 二值化:非黑即白,適合文字識別預處理
    public void binaryImage() throws IOException {
        File src = new File(System.getProperty("user.dir") + "/src/2722425974762424026.jpg");
        BufferedImage image = ImageIO.read(src);
        int w = image.getWidth(), h = image.getHeight();

        BufferedImage binary = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
        for (int x = 0; x < w; x++) {
            for (int y = 0; y < h; y++) {
                int rgb = image.getRGB(x, y);
                binary.setRGB(x, y, rgb); // 自動按閾值二值化
            }
        }
        ImageIO.write(binary, "jpg", new File(System.getProperty("user.dir") + "/src/2722425974762424028.jpg"));
    }

    // 灰度化:256 級灰階,保留細節層次
    public void grayImage() throws IOException {
        File src = new File(System.getProperty("user.dir") + "/src/2722425974762424026.jpg");
        BufferedImage image = ImageIO.read(src);
        int w = image.getWidth(), h = image.getHeight();

        BufferedImage gray = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
        for (int x = 0; x < w; x++) {
            for (int y = 0; y < h; y++) {
                int rgb = image.getRGB(x, y);
                gray.setRGB(x, y, rgb); // 自動按亮度公式灰度化
            }
        }
        ImageIO.write(gray, "jpg", new File(System.getProperty("user.dir") + "/src/2722425974762424027.jpg"));
    }

    public static void main(String[] args) throws IOException {
        new ImageDemo().binaryImage();
        new ImageDemo().grayImage();
    }
}

關鍵類型常量

常量含義適用場景
BufferedImage.TYPE_BYTE_GRAY8位灰度圖 (0-255)圖像增強、特徵提取、打印預覽
BufferedImage.TYPE_BYTE_BINARY1位二值圖 (黑/白)OCR 預處理、條碼識別、文檔歸檔
BufferedImage.TYPE_INT_RGB標準 24 位彩色通用圖像處理基礎類型

效果對比

原圖:原圖

灰度化:灰度化

二值化:二值化

進階擴展:自定義閾值二值化

默認 TYPE_BYTE_BINARY 使用中值閾值(128),若需自定義閾值(如自適應 Otsu 算法),需手動像素運算:


public static BufferedImage customBinary(BufferedImage src, int threshold) {
    int w = src.getWidth(), h = src.getHeight();
    BufferedImage dest = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
    for (int x = 0; x < w; x++) {
        for (int y = 0; y < h; y++) {
            int rgb = src.getRGB(x, y);
            int r = (rgb >> 16) & 0xFF;
            int g = (rgb >> 8) & 0xFF;
            int b = rgb & 0xFF;
            int gray = (r + g + b) / 3; // 或 0.299*r + 0.587*g + 0.114*b
            int binary = (gray >= threshold) ? 0xFFFFFF : 0x000000;
            dest.setRGB(x, y, binary);
        }
    }
    return dest;
}

性能提示

  • 雙層 getRGB/setRGB 速度一般,大圖建議用 getRaster()/getDataBuffer() 直接操作像素數組。
  • 批量處理時復用 BufferedImage 對象,減少 GC 壓力。
  • 生產環境大規模圖像處理建議引入 TwelveMonkeys ImageIO 或 OpenCV (JavaCV)。

Java 標準庫就能搞定基礎灰度/二值化,幾行代碼即可上手。理解 BufferedImage 類型機制,是輕量級圖像處理的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved