Teachers open the door but You must enter by yourself.
【事前学習】ベーシックは 1章1-4〜1-7節、5章、エキスパートは1、6、7章を学んできてください。(ベーシックの6-8章は画像処理検定の内容ですので本講義では割愛します。)
色々な処理が混在して見えるが、一つのチャネルやグレースケールに関する内容(ヒストグラム、トーンカーブ、明度、コントラスト、フィルタリング)と、3つのチャネル間に関する処理(混色、色相、彩度)を分けて考えるとよい
加法混色は光のRGB。光を重ね合わせると各光のRGB値の足し算となるから。光は重ねるほど明るくなる、RGBの各色を混ぜ合わせた基本8色は憶えておく。減法混色は、身近ではプリンタのインク。混ぜ合わせると黒に近づいていく(実際には細かいドットが交互に並んでいるだけだが、ドットが小さいと人間の目には混ざった色に見える)。三色インク(シアン、マゼンタ、イエロー)を混ぜた基本8色は憶えておく。
どちらもデジタル化(離散化)だが、標本化はデジカメやスキャナでアナログ画像を一定間隔でスキャンしてピクセルにすること。量子化は、各ピクセルの色の強度(アナログ値)を例えば256段階に割り当てること。
ピクセル値が大きいほど明るい色、小さいほど暗い色(濃淡値)。
コントラストが大きい画像ではピクセル値の差が大きく(白対黒)くっきりした画像となり、ヒストグラムはすそ野の広い山となる。
コントラストが小さい画像ではピクセル値の差が小さく(グレーばっかり)色ボケした画像となり、ヒストグラムは尖った山となる。
ヒストグラムは濃度値に対するピクセル数の分布。トーンカーブは濃度値に対する画像変換の入出力関係を表す。ソラリゼーションは、唯一の特殊効果的な処理なので注意。
トーンカーブはソラリゼーションも各ピクセルごとに入出力が決まり、周りのピクセルと関係しない。エンボスは少しずれた位置のピクセル値を使う。フィルタリングでは、入力に周辺(近傍)のピクセル値を使う。
カラー画像ではRGB間の色の差が大きいと彩度が高い、俗にいうビビッドカラーとなり、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('toyota.jpg');
}
function setup(){
const canvas=createCanvas(600, 800, WEBGL);
canvas.parent('canvas');
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