人工知能作っちゃう?

画像処理を中心に人工知能を作っていきます。

白黒化

白黒化とは書いて字の如くカラー画像を白黒にすることです。白黒化にもたくさんの方法があって驚きました。一番簡単なのは平均をとる単純平均法ですが今回私は心理物理量を考慮した加重平均がなされているNTSC係数による加重平均法を使いました。
NTSC係数による加重平均法は日本やアメリカのテレビで用いられている輝度信号分離の方法と同じものです。

概要

式はこちらです。
f:id:manato2cc:20161016221651g:plain
Aが最終的な値となります。小数点があるので以下の近似式を使ってもいいそうです。
f:id:manato2cc:20161016221927g:plain
まぁ私はきっちりやるので近似式は使いません。

ではコードを

package Imany.util.algorithm;

import java.awt.image.BufferedImage;

public class BandW extends Algorithm
{
	public static BufferedImage algorithm(BufferedImage img)
	{
		BufferedImage re = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
		for (int x = img.getMinX(); x < img.getWidth(); x++) {
			for (int y = img.getMinY(); y < img.getHeight(); y++) {
				re.setRGB(x,y,toMono(img.getRGB(x,y)));
			}
		}
		return re;
	}

	private static int toMono(int i)
	{
		int b = i & 0xff;//B
		int g = (i & 0xff00) >> 8;//G
		int r = (i & 0xff0000) >> 16;//R

		//NTSC係数による加重平均法
		int y = (int) (0.298912 * r + 0.586611 * g + 0.114478 * b);
		y = (y << 16) | (y << 8) | (y);
		
		return y;
	}

説明する部分はないかと思います。

結果

f:id:manato2cc:20161016222456p:plainf:id:manato2cc:20161016222504p:plain
なんかおしゃれな感じになるんですねぇ...夜景画像なんかは特に綺麗です...