画像処理プログラミング(Saji)
第1回
画像処理とは
画像として表現されたものに変更を加える
画像処理の種類
光学的
被写体→撮影素子の間の処理
ライティング
レンズ
アナログ
撮影素子→ディジタライザの間
電気信号を処理する
デジタル
本授業はここ
離散的情報を処理する
歴史
1920~
画像伝送の始まり
1960~
宇宙・医療工学
1980~
映像・放送技術
1990~
製造現場・センシング
2000~
コミュニケーション・アート・エンタメ
基本機能
強調
前処理に用いられることが多い
コントラスト強調
フィルタリング
など
品質の改良
復元
全ての復元は客観的
既知の測定した元画像の劣化に基づいた修正
解析
結果として画像を作成せずその代わりに元画像の特徴に基づいた数値あるいは図形情報を作成する
圧縮
合成
他の画像、画像でないものなどから画像を作ること
画素の並び替え情報の交換
デジタル画像の生成
細かいピクセルの連続
左上からの座標
ピクセルの一つ一つは数字で表される
標本化
離散点に分割すること
箱に区切る作業
量子化
分割された点の濃淡のデジタル値を決定する
箱の中の値を何段階で表現するか
解像度
素の構成要素をどれだけ分解できるかという値
第2回
実習(基本的な画像の処理)
左右反転
code:ipp2-1.pde
PImage input;
PImage result;
void setup() {
size(1024, 1024);
//pdeファイルと同じディレクトリにdataという名前のフォルダを作り、その中にlenna_mono.jpgを配置すること
input = loadImage("lenna_mono.jpg");
result = createImage(input.width, input.height, RGB);
}
void draw() {
image(input, 0, 0);
//左右上下反転
for (int j=0; j<input.height; j++) {
for (int i=0; i<input.width; i++) {
color c = input.get(i, j);
result.set(input.width-i, input.height-j, c);
}
}
//90度回転
//for (int j=0; j<input.height; j++) {
// for (int i=0; i<input.width; i++) {
// color c = input.get(i, j);
// result.set(input.height-j, i, c);
// }
//}
}
マウス位置による二値化
code:ipp2-2.pde
PImage input;
PImage result;
float threshold;
void setup() {
size(512, 512);
input = loadImage("lenna_mono.jpg");
result = createImage(input.width, input.height, HSB);
colorMode(HSB,360,100,100);
}
void draw() {
threshold = map(mouseX,0,width,0,100);
for (int j=0; j<input.height; j++) {
for (int i=0; i<input.width; i++) {
color c = input.get(i, j);
float b = brightness(c);
color n;
if(b<threshold){
n = color(0,0,0);
}else{
n = color(0,0,100);
}
result.set(i,j,n);
}
}
image(result,0,0);
}
第3回
人間とプロジェクター、カメラの色空間は違う
カメラでは区別できない部分があったり
現象と知覚
カラー画像も上記と同じように標本化量子化空間解像度輝度分解能の同じ概念が適用できる
単一輝度の代わりに3つの色成分を使って量子化
表色系
RGB
HSB(HSV)
色相、彩度、輝度
りんご(赤色部)だけを抜き出すプログラム
code:ipp3-1.pde
PImage input;
PImage result;
float theta = 0;
float siki;
void setup() {
size(512, 512);
//りんごの写真
input = loadImage("main.jpg");
result = createImage(input.width, input.height, HSB);
}
void draw() {
for (int j=0; j<input.height; j++) {
for (int i=0; i<input.width; i++) {
color c = input.get(i, j);
color n;
if (red(c)>130 && green(c)<180 && blue(c)<170) {
if (abs(red(c)-(green(c)+blue(c))/2)<50) {
n = color(0, 0, 0);
} else {
n = c;
}
} else {
n = color(0, 0, 0);
}
result.set(i, j, n);
}
}
image(result, 0, 0);
}
第4回
空間コンボリューション
入力が素とその隣接する画素との重み付け平均をとることで出力画素の値を求める
3*3または5*5での処理が一般的