c言語 画像のモザイク処理を実現したい
画像の左半分を16×16 画素のモザイクをかけて、出力するプログラムを作成したいのですが、現在のプログラムだと一番左の16×16が真っ黒になってしまいます。また、モザイク処理した見本の画像より、モザイクの色が濃くなっています。
これらを解決したいです
発生している問題・エラーメッセージ
該当のソースコード
#include <stdio.h> #include "image1.h" #define N 16 void bmp_cool(bmp_header_t *hd, pixel_t img[MAX_Y][MAX_X]); int main(void) { bmp_header_t hd; pixel_t img [MAX_Y][MAX_X]; bmp_read("in.bmp", &hd, img); /* in.bmp から読み込む */ bmp_cool(&hd, img); /* 処理の呼び出し */ bmp_write("out.bmp", &hd, img); /* out.bmp への書き出し */ return 0; } /* 画像処理の関数の本体 */ void bmp_cool(bmp_header_t *hd, pixel_t img[MAX_Y][MAX_X]) { int i, j; pixel_t a[MAX_Y][MAX_X]; //配列aの初期化 for (i=0; i< hd->biHeight; i++) { for (j=0; j< hd->biWidth; j++) { a[i/N][j/N].r = img[i][j].r; a[i/N][j/N].g = img[i][j].g; a[i/N][j/N].b = img[i][j].b; } } //モザイク処理の計算 for (i=0; i< hd->biHeight; i++) { for (j=0; j< hd->biWidth/2; j++) { a[i/N][j/N].r += img[i][j].r; a[i/N][j/N].g += img[i][j].g; a[i/N][j/N].b += img[i][j].b; if(j%16==0) { a[i/N][j/N].r = a[i/N][j/N].r/N; a[i/N][j/N].g = a[i/N][j/N].g/N; a[i/N][j/N].b = a[i/N][j/N].b/N; for(j=0; j< hd->biWidth/2; j++) { img[i][j].r=a[i/N][j/N].r; img[i][j].g=a[i/N][j/N].g; img[i][j].b=a[i/N][j/N].b; } } } } }
補足情報
Cygwinでコンパイルを行っています。
また、現在のプログラムでは3重ループを使っていますが、できるだけ多重ループは避けたいです。
画像が表示されていません。``` の囲みを外す等して頂けませんか。
申し訳ありません。教えてくださりありがとうございます。変更いたしました。
画像表示されました。ありがとうございます。
ただ"モザイク"と言っても、使用する色をどう求めるかは必ずしもRGBの平均を取るとは決まっていないと思うのですが、アルゴリズムは決まって(合って)いるのでしょうか。
16×16 画素毎に (その 256 画素の) 平均値を計算し, その値をその 16×16 画素すべてに代入せよ、という決まりが与えられています。
そもそも、学校の課題は非推奨質問です。
https://teratail.com/help/avoid-asking
> コードをください・デバッグしてください等の丸投げの質問
> 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
授業で習ってる範疇の技術で解けるような課題しか出してない筈だから、復習したり学校の先生に判らない点を聞いたりして解決してください。
回答4件
あなたの回答
tips
プレビュー