java图像处理,彩色图像转灰度图的几种实现方式

本文详细介绍五种不同的灰度转换算法,包括标准转换、Photoshop转灰度、RGB均值、RGB最低通道及最高通道转灰度。每种算法通过代码实现,展示了不同场景下灰度图的生成方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        一、标准转换公式:

                                                              gray = r * 0.299 + g * 0.587 + b * 0.114

        采用RGB三个通道值分别乘以一个系数(权重),之后再求和,三个系数之和为1,也就是加权平均。

        代码:

        

public BufferedImage transferGrayImage(BufferedImage image) {
		BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
		for (int i = 0; i < image.getWidth(); i++) {
			for (int j = 0; j < image.getHeight(); j++) {
				int rgb = image.getRGB(i, j);
				int r = (rgb >> 16) & 0xff;
				int g = (rgb >> 8) & 0xff;
				int b = rgb & 0xff;
				int gray = (r * 299 + g * 587 + b * 114 + 500) / 1000;
				rgb = (255 & 0xff) << 24 | (gray & 0xff) << 16 | (gray & 0xff) << 8 | gray & 0xff;
				grayImage.setRGB(i, j, rgb);
			}
		}
		return grayImage;
	}

        二、Photoshop转灰度图公式:

                                           Gray = (0.2973*R^2.2  + 0.6274 * G^2.2  + 0.0753 * B^2.2 )^(1/2.2)

        Photoshop的转换方式为,RGB通道分别进行指数为2.2的幂运算,再进行加权平均,之后再开2.2次方。由于计算过程包含幂运算和乘运算,处理过程计算量比较大,可以通过查找表来优化。

        代码:

public BufferedImage transferGrayImageByAdobe(BufferedImage image) {
		BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
		for (int i = 0; i < image.getWidth(); i++) {
			for (int j = 0; j < image.getHeight(); j++) {
				int rgb = image.getRGB(i, j);
				double r = (rgb >> 16) & 0xff;
				double g = (rgb >> 8) & 0xff;
				double b = rgb & 0xff;
				double gray = Math.pow(
						0.2973 * Math.pow(r, 2.2) + 0.6274 * Math.pow(g, 2.2) + 0.0753 * Math.pow(b, 2.2), 1.0 / 2.2);
				rgb = (255 & 0xff) << 24 | ((int) gray & 0xff) << 16 | ((int) gray & 0xff) << 8 | (int) gray & 0xff;
				grayImage.setRGB(i, j, rgb);
			}
		}
		return grayImage;
	}

        

        三、RGB均值转灰度

        求取RGB三个通道均值作为该像素灰度值。

        代码:

public BufferedImage transferGrayImageByAverage(BufferedImage image) {
		BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
		for (int i = 0; i < image.getWidth(); i++) {
			for (int j = 0; j < image.getHeight(); j++) {
				int rgb = image.getRGB(i, j);
				int r = (rgb >> 16) & 0xff;
				int g = (rgb >> 8) & 0xff;
				int b = rgb & 0xff;
				int gray = (r + g + b) / 3;
				rgb = (255 & 0xff) << 24 | (gray & 0xff) << 16 | (gray & 0xff) << 8 | gray & 0xff;
				grayImage.setRGB(i, j, rgb);
			}
		}
		return grayImage;
	}

        四、RGB最低通道转灰度

        取RGB三个通道中最小值最为灰度值。

public BufferedImage transferGrayImageByLowest(BufferedImage image) {
		BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
		for (int i = 0; i < image.getWidth(); i++) {
			for (int j = 0; j < image.getHeight(); j++) {
				int rgb = image.getRGB(i, j);
				int r = (rgb >> 16) & 0xff;
				int g = (rgb >> 8) & 0xff;
				int b = rgb & 0xff;
				int[] arr = new int[] { r, g, b };
				Arrays.sort(arr);
				int gray = arr[0];
				rgb = (255 & 0xff) << 24 | (gray & 0xff) << 16 | (gray & 0xff) << 8 | gray & 0xff;
				grayImage.setRGB(i, j, rgb);
			}
		}
		return grayImage;
	}

        五、RGB最高通道转灰度

public BufferedImage transferGrayImageByHighest(BufferedImage image) {
		BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
		for (int i = 0; i < image.getWidth(); i++) {
			for (int j = 0; j < image.getHeight(); j++) {
				int rgb = image.getRGB(i, j);
				int r = (rgb >> 16) & 0xff;
				int g = (rgb >> 8) & 0xff;
				int b = rgb & 0xff;
				int[] arr = new int[] { r, g, b };
				Arrays.sort(arr);
				int gray = arr[2];
				rgb = (255 & 0xff) << 24 | (gray & 0xff) << 16 | (gray & 0xff) << 8 | gray & 0xff;
				grayImage.setRGB(i, j, rgb);
			}
		}
		return grayImage;
	}

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TheMatrixs

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值