🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

5545閲覧

画像処理のモザイクの仕方について

hikaru_love_n

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/10/25 04:47

編集2019/10/25 05:24

in.bmp の画像の左半分に 16×16 画素のモザイクをかけて out.bmp に出力するプログラム image1mosaic.c を作成せよ. 16×16 画素毎に (その 256 画素の) 平均値を計算し, その値をその 16×16 画素すべてに代入すればよい

という問題なのですが、現在かけているプログラムは下記に貼っているものです。
これだと左半分に斑点のようなものが書けるだけでモザイクになりません。
どこが違うかご指摘いただけないでしょうか?

#include<stdio.h>
#include "image1.h"

void bmp_mosaic(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); //読み込み bmp_mosaic(&hd, img); //呼び出し bmp_write("out.bmp", &hd, img); //書き出し return 0;

}

//画像処理の関数の本体

void bmp_mosaic(bmp_header_t *hd, pixel_t img[MAX_Y][MAX_X]){

int i, j, x, y; unsigned int rr, gg, bb; int size = 16; for(i = 0; i < hd -> biHeight; i += size){ for(j = 0; j < hd -> biWidth / 2; j += size){ rr = 0; gg = 0; bb = 0; for(x = 0; x < size; x++){ if(hd -> biHeight < (i + x)){break;} for(y = 0; y < size; y++){ if(hd -> biWidth < (j + y)){break;} rr += img[i + x][j + y].r; gg += img[i + x][j + y].g; bb += img[i + x][j + y].b; } } rr = rr / size * size; gg = gg / size * size; bb = bb / size * size ; for(x = 0; x < size; x++){ for(y = 0; y < size; y++){ img[i + x][j + y].r = rr; img[i + x][j + y].g = gg; img[i + x][j + y].b = bb; } } } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

rr = rr / size * size;

これじゃ平均にならない

投稿2019/10/25 06:37

fana

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2019/10/25 06:44

おおっと! 「リファクタリング」なるコードで問題点が自然消滅してるw
guest

0

ベストアンサー

左半分

なのは

for(j = 0; j < hd -> biWidth / 2; j += size){

幅を2で割っているからでは?

また、

rr = rr / size * size;

gg = rr / size * size;
bb = rr / size * size;

ggとbbでrrを使っているのはたぶん間違いでしょう。

それと平均値を求めている時に使っている座標↓と

rr += img[i + x][j + y].r;

書き込んでいる座標が違うのものおかしいです。

img[i][j].r = rr;


リファクタリングしたコードを載せておきます。

cpp

1void bmp_mosaic(bmp_header_t *hd, pixel_t img[MAX_Y][MAX_X]) { 2 3 int x, y, dx, dy; 4 unsigned int r, g, b; 5 int size = 16; 6 int pixelCount; 7 8 for (y = 0; y < hd->biHeight; y += size) { 9 for (x = 0; x < hd->biWidth / 2; x += size) { 10 11 r = 0; 12 g = 0; 13 b = 0; 14 pixelCount = 0; 15 16 for (dy = 0; dy < size && y + dy < hd->biHeight; dy++) { 17 for (dx = 0; dx < size && x + dx < hd->biWidth; dx++) { 18 r += img[y + dy][x + dx].r; 19 g += img[y + dy][x + dx].g; 20 b += img[y + dy][x + dx].b; 21 pixelCount++; 22 } 23 } 24 25 r /= pixelCount; 26 g /= pixelCount; 27 b /= pixelCount; 28 29 for (dy = 0; dy < size && y + dy < hd->biHeight; dy++) { 30 for (dx = 0; dx < size && x + dx < hd->biWidth; dx++) { 31 img[y + dy][x + dx].r = r; 32 img[y + dy][x + dx].g = g; 33 img[y + dy][x + dx].b = b; 34 } 35 } 36 37 } 38 } 39}

投稿2019/10/25 04:52

編集2019/10/25 06:33
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikaru_love_n

2019/10/25 04:56

画像の左半分にモザイクをかけたいので幅を2で割っていたのですが、間違いでしょうか? 書き込んでいる座標が違うという点についてもっと詳しく教えていただけますか??
takabosoft

2019/10/25 04:58

ああ、左半分は意図したものでしたか、失礼しました。 > 書き込んでいる座標が違うという点についてもっと詳しく教えていただけますか?? ヒントだけですが、forでx,yで回しているのに中でx,yを使っていないのは不思議だと思いませんか?
hikaru_love_n

2019/10/25 05:13

確かにそうですね!それを踏まえて書き直したところ img[i + x][j + y].r = rr; img[i + x][j + y].g = gg; img[i + x][j + y].b = bb; カラフルなモザイクになったのですが、どのようにしたら通常のモザイクになるでしょうか?
takabosoft

2019/10/25 05:17

とりあえず現在のところまでを質問欄に追記してください。 ソースコードは ```cpp (ここにコードを貼る) ``` というように記述してもらうと、ページ上で見やすくなります。 あと、カラフルってなんでしょう? もし元画像と変換後の画像が載せられるようでしたらそれも追加してください。
hikaru_love_n

2019/10/25 05:25

現在のところまでは追記させていただきました。 ただ画像の貼り方が分からなくて、、、 言葉で説明させていただくと、通常のモザイクではなく、色がついたモザイクになっています。
takabosoft

2019/10/25 06:23

別にモザイクなので、色が付いているのは問題ないですけどねえ。 グレースケール処理なら灰色とかになっていないといけませんが。
takabosoft

2019/10/25 06:25

本題とはあまり関係ありませんが、変数i, j, x, yが何を指しているかかなりわかりにくいですし、xとyは意味合い的には逆に使っている(実行結果はたぶん間違いない)ので、大変よみづらいです。 iとjをy, xに、xやyをdx,dyなどとすると、読みやすくなるかもしれません。
hikaru_love_n

2019/10/25 06:27

実行結果が課題の本文に貼っていて、グレースケールにしないといけないんです、、、 なるほどです!
takabosoft

2019/10/25 06:36

コンパイル通るかわかりませんが、リファクタリングしたコードを回答欄に追記しておきました。 > 実行結果が課題の本文に貼っていて、グレースケールにしないといけないんです、、、 少なくともこの質問欄には「左半分にモザイクを掛けろ」としかかいてありませんので、 グレースケールが必要なのかどうかはこちらはわからんです。
hikaru_love_n

2019/10/25 06:40

ありがとうございます。解決しました。 すいません、記述不足でしたね、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問