HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-01-04 (Sun) Today's Access : 192 Total : 1260890. Since 10 Sep. 2019

減色処理 グレースケール・二値化
2022.05.04

YouTube でも紹介しています。画像をクリックすると再生できます。

今回はカラー画像を、まずグレースケールに変換し、次にフロイト-シュタインバーグ・ディザリングを適用した二値化処理を行います。
ここでは、下記の3通りのグレースケール化を実施してみました。

1.RGB平均値によるグレースケール化

2.ガンマ補正を考慮した、RGB加重平均によるグレースケール化

3.ガンマ補正なしの、RGB加重平均によるグレースケール化


■1.RGB平均値によるグレースケール化と二値化
画像を色味のない明るさの度合い(Luminance、輝度)だけで表現するのがグレースケールです。
RGB平均値によるグレースケール化
R,G,B は3つ同じ値で加色混合すると無彩色(黒~グレー~白)になるよう輝度がバランス調整されています。
luminance = (R + G + B) / 3.0;
R = luminance;
G = luminance;
B = luminance;
これにより、カラー画像をグレースケールすると左の画像が得られます。

これにフロイト-シュタインバーグ・ディザリングを適用した二値化処理を行います。
●フロイド-スタインバーグ・ディザリング
フロイド-スタインバーグ・ディザリング(Floyd–Steinberg dithering)は画像用ディザリングアルゴリズムであり、1976年、ロバート・フロイドと Louis Steinberg が発表した。画像操作関係のソフトウェアで広く用いられており、例えば最大256色までしか使えないGIF形式への変換の際に使われています。
各ピクセルの量子化誤差をそれに隣接するピクセル群に拡散させることでディザリングを実現するアルゴリズムです。 隣接ピクセルへの誤差の分配は次のようになります。

星印 (*) が現在見ているピクセルを表しています。
このアルゴリズムでは、画像を左から右、上から下にスキャンし、ピクセルの値を1つずつ量子化していきます。 毎回の量子化誤差は隣接するピクセル群に分配されますが、既に量子化が済んだピクセルの値は変更しません。 これにより、あるピクセルの値が量子化によって切り下げられたら、次のピクセルにその誤差が反映されて切り上げられることになり、全体として量子化誤差がゼロに近づくことになります。
Ref.フロイド-スタインバーグ・ディザリング(ウィキペディア)
Ref.誤差拡散法
Ref.Image Dithering: Eleven Algorithms and Source Code

●二値化
二値化において、誤差の基準になるのが、しきい値です。 このしきい値を上回る輝度をもつピクセルを白に、しきい値以下のピクセルを黒にします。 しきい値と輝度の差を誤差として拡散させていきます。

この処理の部分の抜粋です。
typedef struct {
	uint8_t  R;
	uint8_t  G;
	uint8_t  B;
} PIXEL_INFO;

void FloydSteinbergBinarize(PIXEL_INFO *rgb, uint32_t height, uint32_t width) {
	uint32_t   x, y, pos;
	const uint8_t threshold = 127;
	uint8_t    bw, luminance;
	int8_t     *error, e;
	PIXEL_INFO *imgpt;
	error = (int8_t *)malloc(width * height);
	memset(error,0x00,width * height);

	imgpt = rgb;
	for (y=0; y < height; y++) {
		for (x=0; x < width; x++) {
			pos = width * y + x;
			luminance = imgpt->R + error[pos];
			if (threshold < luminance) {
				bw = 255;
			} else {
				bw = 0;
			}
			e = luminance - bw;

			if ((x+1)<width) {
				pos = width * y + (x + 1);
				error[pos] += (uint8_t)(e * 7/16);
			}
			if ( ((x-1)>=0) && ((y+1)<height) ) {
				pos = width * (y + 1) + (x - 1);
				error[pos] += (uint8_t)(e * 3/16);
			}
			if ((y+1)<height) {
				pos = width * (y + 1) + x;
				error[pos] += (uint8_t)(e * 5/16);
			}
			if ( ((x+1)<width) && ((y+1)<height) ) {
				pos = width * (y + 1) + (x + 1);
				error[pos] += (uint8_t)(e * 1/16);
			}
			imgpt->G = bw;
			imgpt++;
		}
	}
	free(error);

	imgpt = rgb;
	for (y=0; y < height; y++) {
		for (x=0; x < width; x++) {
			imgpt->R = imgpt->G;
			imgpt->B = imgpt->G;
			imgpt++;
		}
	}
}

void shiftBit(IMAGE_INFO *img, uint8_t sR, uint8_t sG, uint8_t sB) {

	int        x,y;
	PIXEL_INFO *imgpt;

	imgpt = img->RGBs;
	for(y=0; y < img->Height; y++){
		for(x=0; x < img->Width; x++){
			imgpt->B = imgpt->B >> sB;
			imgpt->G = imgpt->G >> sG;
			imgpt->R = imgpt->R >> sR;
			imgpt++;
		}
	}
}
誤差というのは、グレースケール化した輝度の値を、しきい値で二値化したときの、輝度と白あるいは黒との差分です。 この誤差を隣接するピクセルに対して、一定の拡散比率で加算していきます。 これを繰り返すことでディザリングを行います。

グレースケール画像に、フロイト-シュタインバーグ・ディザリングを適用した二値化処理を行うと下記の画像が得られます。


■2.ガンマ補正を考慮した、RGB加重平均によるグレースケール化と二値化
「色」を扱うディスプレイ、プリンタ、スキャナなどの各機器には固有の発色特性があり、 入力された色情報をそのまま出力できません。この入出力における発色特性のことを「ガンマ特性」といいます。 通常、ディスプレイ(CRT)のガンマ特性は中間調が暗くなる傾向にあります。 そこで事前に中間調を明るくしたデータ信号に加工して、「入力:出力」のバランスを「1:1」に近づけることで、色情報を正確にやり取りできるようにします。 ディスプレイ側のガンマ特性に合わせて、色情報を調整して帳尻を合わせる仕組みを「ガンマ補正」と呼びます。

Ref.EIZO 第7回 "曲線美"が色再現性の決め手になる?

ブラウン管のガンマ特性は、sRGBのガンマカーブ、gamma=2.2で近似されます。
y = x2.2 (x, y は 0~1 に正規化)

※sRGBは、1998年に国際電気標準会議 IECが策定した色空間の国際基準です。ソフト、ディスプレイ、プリンタ、デジタルカメラなどがsRGB対応であれば、撮影した写真を画面で見た色で印刷できます。
補足すると、昔のブラウン管テレビが陰極管の物理特性により入力信号の電圧に対して出力する輝度が比例しなかった(陰極管特性)ので、送信側で補正していました。 液晶ディスプレイの輝度出力にガンマ特性は存在しませんが、互換性が考慮されています。

このガンマ特性を相殺するために、元画像には逆ガンマ補正が掛かっています。
y = x(1/2.2) (x, y は 0~1 に正規化)

グレースケール化する前に、色情報に施されているガンマ補正を外して、輝度と色情報を線形化(linear-RGB 化)させます。
y = x2.2 (x, y は 0~1 に正規化)

void gammaCorrect(PIXEL_INFO *rgb, uint32_t height, uint32_t width, float gamma) {

	uint32_t   x, y;
	float      Rval, Gval, Bval;
	for(y=0; y < height; y++){
		for(x=0; x < width; x++){
			Rval = (float)rgb->R / 255;
			Gval = (float)rgb->G / 255;
			Bval = (float)rgb->B / 255;
			rgb->R = (uint8_t)(pow(Rval,gamma) * 255);
			rgb->G = (uint8_t)(pow(Gval,gamma) * 255);
			rgb->B = (uint8_t)(pow(Bval,gamma) * 255);
			rgb++;
		}
	}
}

gammaCorrect(img->RGBs, img->Height, img->Width, 2.2);


元画像とガンマ補正後の画像を比較してみます。 輝度とRGB値が線形化され、明るく補正されていた元画像の中間調の輝度が低くなっています。

BT.709系画像処理におけるグレースケール化
デジタル放送やsRGBをグレースケール化する際には、BT.709の加重平均が用いられます。 BT.709は、高精細テレビジョン放送のエンコードと信号特性について制定された標準規格です。
luminance = (R * 0.2126) + (G * 0.7152) + (B * 0.0722)



先程と同様に、フロイト-シュタインバーグ・ディザリングを適用した二値化処理を行います。


ちなみに、グレースケール化した画像を二値化せずに、逆ガンマ補正するとこんな感じになります。
y = x(1/2.2) (x, y は 0~1 に正規化)



■3.ガンマ補正なしのRGB加重平均によるグレースケール化
SDTV規格 BT.601では、ガンマ補正が施されたまま R,G,B を加重平均します。OpenCVやPILのGrayscale化にはこの加重平均が使われているようです。
luminancee = (R * 0.299) + (G * 0.587) + (B * 0.114)


二値化します。


■補足:Weber–Fechner(ヴェーバー‐フェヒナー)の法則
人間の感覚は刺激の物理強度に線形ではなく、その対数に適応していて、Weber–Fechner(ヴェーバー‐フェヒナー)の法則として知られています。
人の目は低輝度の変化に敏感であり、高輝度には鈍感です。そのため、被写体を撮影画像ファイル等のRGB値は、通常ガンマ補正という処理が行われ、視覚的に魅力的な画像を作り上げています。

■参考文献
ガンマ補正のうんちく
画像の誤差拡散による2値化 ~ガンマ値考慮Ver.+~

Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2020.05.28 画像処理 第1回トイカメラ
2020.06.09 画像処理 第2回カメラモジュール制御
2020.06.28 画像処理 第3回リアルタイムクロック
2020.07.08 画像処理 第4回電源回路
2020.10.27 画像処理 第5回自作デジカメ初号機完成
2020.11.10 画像処理 第6回ドーナツデジカメ
2021.05.16 画像処理・基本変換
2021.07.10 M5Stackアプリの移植
2022.04.04 減色処理 雑談
2022.04.18 減色処理 均等量子化法とK平均法
2022.05.04 減色処理 グレースケール・二値化
2022.05.18 減色処理 二値化画像印刷
2022.08.12 京セラ feelH” Treva カメラ
2022.10.15 デジカメ弐号機 1.仕様変更
2022.10.21 デジカメ弐号機 2.SDカードとRTC
2022.11.04 デジカメ弐号機 3.SPI DISPLAY
2022.11.18 デジカメ弐号機 4.ストリーミング
2022.12.02 デジカメ弐号機 5.機能統合
2022.12.17 デジカメ弐号機 6.完成
2023.05.15 アナログ風ゲージ
2023.06.01 ADS1115デジタル電圧計
2023.10.01 立体視(ステレオグラム)
2023.10.16 漢字フォントの表示と拡張
2024.04.08 自作デジカメ参号機・雑談
2024.08.24 シリアルカメラ
2025.07.23 C3.jsによるグラフ描画
2025.09.09 東芝デジタルカメラユニット DMR-C1
2025.10.10 AQM1248A小型液晶ボード
2025.10.11 Monochrome OLED
2025.12.31 キャラクターディスプレイで遊ぶ

たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」 「一念発起して何かを始めても、いつも三日坊主で終わってしまう」 「色んなことを先延ばしにしたまま、時間だけが過ぎていく」 そこで本書では、そんな著者が独自に開発した、 まったく新しい目標達成メソッド「100日デザイン」について、 その知識と技術を、余すところなくご紹介します。

まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。 ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。

今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。

ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。 29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!

【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。 基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説! 500以上のサンプルを掲載。実行結果も確認。 全24章の包括的なチュートリアル。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。

Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード

電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)

Copyright © 2011-2027 Sarako Tsukiyono All rights reserved®.