Teachers open the door but You must enter by yourself.
【事前学習】ベーシックの 1章1-4~1-7節、5章、エキスパートの1、6、7章を復習してきてください。(ベーシックの6-8章は画像処理検定の内容ですので不要です。)
どちらもデジタル化(離散化)だが、標本化はデジカメやスキャナでアナログ画像を一定間隔でスキャンしてピクセルにすること。量子化は、各ピクセルの色の強度(アナログ値)を例えば256段階に割り当てること。
ピクセル値が大きいほど明るい色、小さいほど暗い色(濃淡値)。
コントラストが大きい画像ではピクセル値の差が大きく(白対黒)くっきりした画像となり、ヒストグラムはすそ野の広い山となる。
コントラストが小さい画像ではピクセル値の差が小さく(グレーばっかり)色ボケした画像となり、ヒストグラムは尖った山となる。
カラー画像ではRGB間の色の差が大きいと彩度が高い、俗にいうビビッドカラーとなり、RGB差が小さいと彩度が低い(グレー画像に近い)落ち着いた色となる。
ヒストグラムは濃度値に対するピクセル数の分布。トーンカーブは濃度値に対する画像変換の入出力関係を表す。
p5.js Web Editor で実行してみましょう。
let Input,Output;
const Histogram=Array(256).fill(0);
const Histogram2=Array(256).fill(0);
function preload(){
Input=loadImage('//www.om-lab.org/lecture/pro2/toyota.jpg');
}
function setup(){
const canvas=createCanvas(600, 800, WEBGL);
frameRate(30);
Output = createImage(Input.width, Input.height);
//RGB値をグレースケールレベルに変換
for(let y=0; y< Input.height; y++){
for(let x=0; x< Input.width; x++){
const input=Input.get(x,y);
const gray = red(input)*0.3+green(input)*0.59+blue(input)*0.11;
Input.set(x,y,color(gray, gray, gray));
}}
Input.updatePixels();
Output = createImage(Input.width, Input.height);
for(let y=0; y< Input.height; y++){
for(let x=0; x< Input.width; x++){
const input=red(Input.get(x,y));
//明度を上げる
const output=input<128 ? input*2 : 255;
Output.set(x,y,color(output, output, output));
//ヒストグラムの頻度を加算
Histogram[input]++;
Histogram2[output]++;
}}
Output.updatePixels();
}
function draw(){
ortho(-300, 300, -400, 400);
image(Input,-300,-400, 600,400);
image(Output,-300,0, 600,400);
noFill();
stroke(255,0,0);
strokeWeight(2);
beginShape();
for(let i=0;i<256;i++) vertex(-256+i*2,-Histogram[i]*0.06);
//Histogram.forEach((hi,i)=>vertex(-256+i*2,-hi+100*0.06));と略記可
endShape();
beginShape();
for(let i=0;i<256;i++) vertex(-256+i*2,-Histogram2[i]*0.06+400);
//Histogram2.forEach((hi,i)=>vertex(-256+i*2,-hi*0.06+400));と略記可
endShape();
}
※ 処理後のヒストグラム(鮮明な赤色)では、山が右に移動していると共に画素値が256の頻度が著しく高くなっている。
※ 右クリックでダウンロードし、p5.js Web Editor の Sketch Files/Upload file でアップロードする。
以下の処理を実現してみましょう。
output=input>127?255:0;
output=input>127?input*2-256:0;
output=input>191?255: input>127?170: input>63?85:0;
output = 0.75*input*(input-192.0)*(input-192.0)/4096.0+32;
【事後学習】公式問題集のベーシックは各回の第2問、エキスパートは各回の第7、8問が画像処理の問題です。これらの問題をプログラムで実装できるようになってください。
This site is powered by