【186】Java8根据YUV颜色编码方法将彩色图片转成灰度图(即平常所指的黑白图片)

RGB和YUV是两种不同的色彩编码方法。

RGB是使用红、绿、蓝三原色的方式来编码像素的颜色。多用于图片。

YUV采用明亮度和色度来表示像素颜色。其中,Y 表示明亮度(Luminance、Luma),而 U 和 V 表示色度(Chrominance、Chroma)。YUV多用于视频,如果每个像素只用Y,不用UV,那么就是灰度图。在黑白电视机和彩色电视机共存的年代,YUV被用来兼容黑白电视机和彩色电视机的信号。

RGB转YUV的公式,基于 NTSC standard :

Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
V = 0.615 * R - 0.515 * G - 0.100 * B

在上面三个等式中,如果把YUV视为常量,RGB视为未知数,那么可以把上面三个等式看作三元一次方程组。

解三元一次方程组,可得 RGB 的公式:

R = Y + 1.14 * V
G = Y - 0.39 * U - 0.58 * V
B = Y + 2.03 * U

下面式彩色图片转灰度图的Java代码:

package zhangchao.testalgorithm.changeimage;

import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

import java.awt.Color;
import java.awt.image.BufferedImage;


/**
 * 彩色图片转变成灰度图像(即平时所说的黑白照片)
 * @author zhangchao
 *
 */
public class ColorToGrayscaleUtils {

	public static void main(String[] args) {
		
		int a = 183;
		double dbA = (double)a;
		System.out.print("a=" + a + "  dbA=" + dbA);
		
		File inputFile = new File("D:\\testTemp\\ColorToGrayscaleUtils\\origin.jpg");
		File outputFile = new File("D:\\testTemp\\ColorToGrayscaleUtils\\output.jpg");
		ColorToGrayscaleUtils.changeByYUV(inputFile, outputFile, "jpg");
	}
	
	
	/**
	 * 用YUV色彩编码方案把彩色图片转成灰度图。
	 * @param inputFile 输入文件。
	 * @param outputFile 输出文件。
	 * @param formatName 输出文件的图片格式。
	 */
	public static void changeByYUV(File inputFile, File outputFile,
			final String formatName) {
		try {
			BufferedImage inputImage = ImageIO.read(inputFile);
			int width = inputImage.getWidth();
			int height = inputImage.getHeight();
			// 新生成的图片
            BufferedImage imageNew = new BufferedImage(width, height, inputImage.getType());
			
			for (int y = 0; y < height; y++) {
				for (int x = 0; x < width; x++) {
					int rgb = inputImage.getRGB(x, y);
					Color c = new Color(rgb);
					int r = c.getRed();
					int g = c.getGreen();
					int b = c.getBlue();
					
					double dbR = (double)r;
					double dbG = (double)g;
					double dbB = (double)b;
					
					double dbY = 0.299 * dbR + 0.587 * dbG + 0.114 * dbB;
					int intY = (int)dbY;
					Color newColor = new Color(intY, intY, intY);
					imageNew.setRGB(x, y, newColor.getRGB());
				}
			}
			ImageIO.write(imageNew, formatName, outputFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

你可能感兴趣的:(音视频图像,JAVA,算法,java,图片,算法)