j2me プラットフォームで画像処理プロジェクトに取り組んでいます。セピア、グレースケール、ネガ、ポスタライズなど、畳み込み行列を含まない単純な効果を適用することができました。畳み込み行列を使用してぼかし効果を適用することさえできました。
int matrix[][] = {{1,1,1},{1,1,1},{1,1,1}}
しかし、コンバージョンを変更すると。エンボス効果とスケッチ効果のマトリックスを使用すると、予期しない結果が得られます。以下は私のコードです。どこで間違ったのか教えてください。次の畳み込み行列を使用しています。
- エンボス効果の場合:
int matrix[][] = {{-18,-9,0},{-9,9,9},{0,9,18}}
- エッジ検出の場合:
int matrix[][] = {{0,9,0},{9,36,9},{0,9,0}}
次のリンクを参照しました: http://beej.us/blog/data/convolution-image-processing/および http://www.pixastic.com/lib/docs/
public void sketchEffect() {
/*
* below is the convolution Matrix for blur effect and it works fine
* int convolutionMatrix[][] = {
* {1, 1, 1},
* {1, 1, 1},
* {1, 1, 1}
* };
*
/*
* Convolution matrix for edge dtetction(Not working)
*/
int convolutionMatrix[][] = {
{0, 9, 0},
{9, -36, 9},
{0, 9, 0}
};
//Loading image
try {
image1 = Image.createImage("/image5.jpg");
} catch (IOException ex) {
ex.printStackTrace();
}
// 1D array for storing RGB values
//Width = 640px
//Height = 360px
int sourceImageArray[] = new int[640 * 360];
image1.getRGB(sourceImageArray, 0, 640, 0, 0, 640, 360);
int aa, rr, bb, gg;
int a1, r1, g1, b1;
int sumR = 0, sumG = 0, sumB = 0, sumA = 0;
int currentPix;
for (int i = 1; i < 359; i++) {
for (int j = 1; j < 639; j++) {
currentPix = sourceImageArray[(i * 640) + j];
a1 = (currentPix >> 24) & 0xFF;
r1 = (currentPix >> 16) & 0xFF;
g1 = (currentPix >> 8) & 0xFF;
b1 = (currentPix >> 0) & 0xFF;
/*
* multiplying neighbouring elements of current pixel to its corresponding
* element in convolution matrix
*/
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
rr = (sourceImageArray[((i + x) * 640) + (j + y)] >> 16) & 0xFF;
gg = (sourceImageArray[((i + x) * 640) + (j + y)] >> 8) & 0xFF;
bb = (sourceImageArray[((i + x) * 640) + (j + y)] >> 0) & 0xFF;
sumR += (rr * convolutionMatrix[x + 1][y + 1]);
sumG += (gg * convolutionMatrix[x + 1][y + 1]);
sumB += (bb * convolutionMatrix[x + 1][y + 1]);
rr = gg = bb = 0;
}
}
sumR = sumR / 9;
sumG = sumG / 9;
sumB = sumB / 9;
if (sumR < 0) {
sumR = 0;
}
if (sumG < 0) {
sumG = 0;
}
if (sumB < 0) {
sumB = 0;
}
if (sumR > 255) {
sumR = 255;
}
if (sumG > 255) {
sumG = 255;
}
if (sumB > 255) {
sumB = 255;
}
sourceImageArray[(i * 640) + j] = (a1 << 24) | (sumR << 16)|(sumG << 8)| sumB;
sumR = sumB = sumG = 0;
rr = gg = bb = 0;
}
}
}