10. ピクセルデータにアクセス
int getPixel(int x, int y); ← 遅いので使わない
int setPixel(int x, int y); ← 遅いので使わない
void getPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)
void setPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)
ピクセル情報は1次元配列
横幅と高さはBitmap.getWidth()とBitmap.getHeight()で取得可能
0000 0000 0000 0000 0000 0000 0000 0000
Alpha Red Green Blue
例) r = (pixel & 0x00FF0000) >> 16
11. ビット反転
// ビット反転を行う
for (int i = 0; i < width * height; i++) {
// ビット反転して透明度を最大値にする
pixels[i] = ~pixels[i] | 0xFF000000;
}
※Alpha値を反転すると何も見えなくなります
12. グレイスケール1
平均値によるグレイスケール
for (int i = 0; i < width * height; i++) {
// RGBカラー値を取得
int r = (pixels[i] & 0x00FF0000) >> 16;
int g = (pixels[i] & 0x0000FF00) >> 8;
int b = (pixels[i] & 0x000000FF) >> 0;
// グレー色を作成
int gray = (r + g + b) / 3; // 平均
int pixel = 0xFF000000 | (gray << 16) | (gray << 8) | gray;
// ピクセルデータにセット
pixels[i] = pixel;
R G B }
3
13. グレイスケール2
テレビ方式よるグレイスケール
for (int i = 0; i < width * height; i++) {
// RGBカラー値を取得
int r = (pixels[i] & 0x00FF0000) >> 16;
int g = (pixels[i] & 0x0000FF00) >> 8;
int b = (pixels[i] & 0x000000FF) >> 0;
// グレー色を作成
int gray = (int)(0.299f * (float)r + 0.587f * (float)g
+ 0.114f * (float)b);
int pixel = 0xFF000000 | (gray << 16) | (gray << 8) | gray;
// ピクセルデータにセット
0.299R 0.587G 0.114B pixels[i] = pixel;
}
14. コントラスト変换1
元画像で min < V < max のと
き V min
V 255
max min
int bright[] = new int[width * height];
int max = 0, min = 256;
for (int i = 0; i < width * height; i++) {
// グレー色を作成(テレビ方式)
int gray = (int)(0.299f * (float)r + 0.587f * (float)g
+ 0.114f * (float)b);
bright[i] = gray;
// 最大値と最小値を取得
if (max < gray) max = gray;
if (min > gray) min = gray;
}
for (int i = 0; i < width * height; i++) {
float after = (float)(bright[i] - min)
/ (float)(max - min) * 255f;
int gray = (int)after;
pixels[i] = (0xFF000000 | (gray << 16) |
(gray << 8) | gray);
}
16. コントラスト変换2
緑の線は累積度数を示す
① LookUpTableを作成する(上側緑の線)
② LookUpTableに従って明度変換
ヒストグラム画像は http://www.mis.med.akita-u.ac.jp/~kata/image/lenna/equalize.html より