1什么是图像处理----来源百度百科

之前我们已经成功配置好了Java环境,相信大家已经迫不及待想要大显身手了吧,开始吧

这次的笔记是关于图像处理的,非常基础。

图像处理(image processing)又称为影像处理,是用计算机对图像进行达到所需结果的技术。起源于20世纪20年代,一般为数字图像处理。图像处理技术的主要内容包括图像压缩、增强复原、匹配描述识别3个部分,常见的处理有图像数字化、图像编码、图像增强、图像复原、图像分割和图像分析等。图像处理是利用计算机对图像信息进行加工以满足人的视觉心理或者应用需求的行为,应用广泛,多用于测绘学、大气科学、天文学、美图、使图像提高辨识等。

1 )图像变换:由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理(如傅立叶变换可在频域中进行数字滤波处理)。目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。

2 )图像编码压缩:图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。

3 )图像增强和复原:图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像。

4 )图像分割:图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。

5 )图像描述:图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。

6 )图像分类(识别):图像分类(识别)属于模式识别的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别人工神经网络模式分类在图像识别中也越来越受到重视。

2.灰度图

在我们的日常生活中,会遇到需要灰色图片的时候,某些情况下,灰色图片说不定比彩色图片更具有冲击力,现在我们尝试用Java来实现将彩色的图片转换为灰色的图片吧

原图


import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class ImageBlackAndwhite {
    public static void main(String[] args) {
        try {
            File input = new File("src\\image\\output\\inverted_inverted_up53.png");
            BufferedImage image = ImageIO.read(input);
            for (int y = 0;y<image.getHeight();y++) {
                for (int x= 0;x < image.getWidth();x++) {
                    int p = image.getRGB(x, y);

                    int a = (p>>24) & 0Xff;
                    int r = (p>>16) & 0Xff;
                    int g = (p>>8)  & 0Xff;
                    int b = p & 0xff;

                    // int avg = (int) (0.299 * r + 0.587 *g + 0.114 *b);
                    int avg = (int) (0.299 * r + 0.587 * g + 0.114 * b);
                    p = (a <<24 ) | (avg << 16) | (avg << 8) | avg;
                    image.setRGB(x, y, p);

                }

            }
            File output = new File("output.jpg");
            ImageIO.write(image, "jpg", output);
            System.out.println("Image sueccful");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

效果图

对单张图片的效果,改进代码,对整个文件夹都生效,源码如下

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

public class ImageBlackAndWhite2 {
    public static void main(String[] args) {
        try {
            File folder = new File("src\\image");  // 输入文件夹路径
            File[] files = folder.listFiles((dir, name) -> name.toLowerCase().endsWith(".png") || name.toLowerCase().endsWith(".jpg"));

            for (File inputFile : files) {
                if (inputFile.isFile()) {
                    BufferedImage image = ImageIO.read(inputFile);
                    
                    for (int y = 0; y < image.getHeight(); y++) {
                        for (int x = 0; x < image.getWidth(); x++) {
                            int p = image.getRGB(x, y);
                            int a = (p >> 24) & 0xff;
                            int r = (p >> 16) & 0xff;
                            int g = (p >> 8) & 0xff;
                            int b = p & 0xff;

                            int avg = (int) (0.299 * r + 0.587 * g + 0.114 * b);
                            p = (a << 24) | (avg << 16) | (avg << 8) | avg;
                            image.setRGB(x, y, p);
                        }
                    }
                    
                    File outputFolder = new File("blackwhite_images");
                    if (!outputFolder.exists()) {
                        outputFolder.mkdirs();
                    }
                    
                    File outputFile = new File(outputFolder, "bw_" + inputFile.getName());
                    ImageIO.write(image, "jpg", outputFile);
                    System.out.println("Processed " + inputFile.getName());
                }
            }
            System.out.println("All images processed successfully.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

灰度图片就搞定了。

3.图片反转


图像反转,也称为图像反色或负片效果,是一种将图像中每个像素的颜色值反转的操作。具体来说,就是将每个像素的颜色值从0到255(对于灰度图像)或从0到255的RGB值(对于彩色图像)转换为其补色值。这种操作在不同的领域和应用中有着多种用途:我第一次见到反转的图片,感到了深深的震撼,效果挺惊艳的。

原图

上代码

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

public class InvertImage {

    public static void main(String[] args) {
        try {
            BufferedImage originalImage = ImageIO.read(new File("src\\image\\output\\inverted_inverted_up52.png"));
            BufferedImage invertedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);

            for (int x = 0; x < originalImage.getWidth(); x++) {
                for (int y = 0; y < originalImage.getHeight(); y++) {
                    int rgb = originalImage.getRGB(x, y);
                    int r = (rgb >> 16) & 0xFF;
                    int g = (rgb >> 8) & 0xFF;
                    int b = rgb & 0xFF;

                    int invertedR = 255 - r;
                    int invertedG = 255 - g;
                    int invertedB = 255 - b;

                    invertedImage.setRGB(x, y, (invertedR << 16) | (invertedG << 8) | invertedB);
                }
            }
            ImageIO.write(invertedImage, "jpg", new File("src\\image\\up52.jpg"));
            System.out.println("图片反显成功!");
        } catch (IOException e) {
            System.err.println("图片处理失败: " + e.getMessage());
        }
    }
}

// 这是对单个图片的操作

效果图

同样的,这是对一张图片进行操作,改进我们的代码,并整个文件夹生效

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

public class InvertImageBatch {

    public static void main(String[] args) {
        File folder = new File("C:\\Users\\fl\\Desktop\\java\\java_test\\test\\src\\image");
        File[] files = folder.listFiles((dir, name) -> name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith(".jpeg"));

        if (files == null || files.length == 0) {
            System.out.println("文件夹中没有图片文件.");
            return;
        }

        for (File file : files) {
            try {
                // 读取原始图像
                BufferedImage originalImage = ImageIO.read(file);
                BufferedImage invertedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);

                // 反转图像颜色
                for (int x = 0; x < originalImage.getWidth(); x++) {
                    for (int y = 0; y < originalImage.getHeight(); y++) {
                        int rgb = originalImage.getRGB(x, y);
                        int r = (rgb >> 16) & 0xFF;
                        int g = (rgb >> 8) & 0xFF;
                        int b = rgb & 0xFF;

                        int invertedR = 255 - r;
                        int invertedG = 255 - g;
                        int invertedB = 255 - b;

                        invertedImage.setRGB(x, y, (invertedR << 16) | (invertedG << 8) | invertedB);
                    }
                }

                // 保存反转后的图像
                String outputFileName = "inverted_" + file.getName();
                File outputFile = new File(folder, outputFileName);
                ImageIO.write(invertedImage, "jpg", outputFile);
                System.out.println("图片反显成功: " + outputFileName);

            } catch (IOException e) {
                System.err.println("处理图片失败: " + file.getName() + " - " + e.getMessage());
            }
        }
    }
}

这样图片反转就完成了,接下来我们尝试恢复它,先对单个图片进行操作

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

public class InvertImage {

    public static void main(String[] args) {
        try {
            BufferedImage originalImage = ImageIO.read(new File("src\\image\\up.jpg"));
            BufferedImage invertedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);

            for (int x = 0; x < originalImage.getWidth(); x++) {
                for (int y = 0; y < originalImage.getHeight(); y++) {
                    int rgb = originalImage.getRGB(x, y);
                    int r = (rgb >> 16) & 0xFF;
                    int g = (rgb >> 8) & 0xFF;
                    int b = rgb & 0xFF;

                    int invertedR = 255 - r;
                    int invertedG = 255 - g;
                    int invertedB = 255 - b;

                    invertedImage.setRGB(x, y, (invertedR << 16) | (invertedG << 8) | invertedB);
                }
            }
            ImageIO.write(invertedImage, "jpg", new File("src\\image\\up.jpg"));
            System.out.println("图片反显成功!");
        } catch (IOException e) {
            System.err.println("图片处理失败: " + e.getMessage());
        }
    }
}

// 这是对单个图片的操作

然后是尝试恢复整个文件夹,直接上代码吧

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

public class BatchInvertImages {

    public static void main(String[] args) {
        String inputFolderPath = "C:\\Users\\fl\\Desktop\\java\\java_test\\test\\src\\image";
        String outputFolderPath = "C:\\Users\\fl\\Desktop\\java\\java_test\\test\\src\\image\\output";

        File inputFolder = new File(inputFolderPath);
        File outputFolder = new File(outputFolderPath);

        // 如果输出文件夹不存在,则创建
        if (!outputFolder.exists()) {
            outputFolder.mkdirs();
        }

        // 遍历输入文件夹中的所有文件
        File[] files = inputFolder.listFiles();
        if (files != null) {
            for (File file : files) {
                // 检查是否为图片文件
                if (file.isFile() && (file.getName().endsWith(".jpg") || file.getName().endsWith(".png"))) {
                    try {
                        BufferedImage originalImage = ImageIO.read(file);
                        BufferedImage invertedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);

                        for (int x = 0; x < originalImage.getWidth(); x++) {
                            for (int y = 0; y < originalImage.getHeight(); y++) {
                                int rgb = originalImage.getRGB(x, y);
                                int r = (rgb >> 16) & 0xFF;
                                int g = (rgb >> 8) & 0xFF;
                                int b = rgb & 0xFF;

                                int invertedR = 255 - r;
                                int invertedG = 255 - g;
                                int invertedB = 255 - b;

                                invertedImage.setRGB(x, y, (invertedR << 16) | (invertedG << 8) | invertedB);
                            }
                        }

                        // 保存反转后的图片到输出文件夹
                        String outputFileName = "inverted_" + file.getName();
                        File outputFile = new File(outputFolder, outputFileName);
                        ImageIO.write(invertedImage, "jpg", outputFile);
                        System.out.println("图片反转成功: " + outputFileName);
                    } catch (IOException e) {
                        System.err.println("图片处理失败: " + file.getName() + " - " + e.getMessage());
                    }
                }
            }
        } else {
            System.err.println("输入文件夹不存在或没有文件.");
        }
    }
}


// 这是对文件夹进行操作

// 这是对文件夹进行操作,将文件夹里面的图片全部恢复

这段代码可以将对应文件夹里面的反转图片全部恢复,图像处理暂时就到这里吧--------持续更新中