並列処理輪講2009/画像処理
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[並列処理輪講2009]]
*PGMを使った画像処理プログラム [#l950c89a]
モノクロの画像を扱うPGMファイルのヘッダにはマジックナンバー"P5"と画像の大きさ、階調を定義する。
あとは、単純にモノクロの画素の値を与えてやれば良い。
**PGM読み出し関数 [#wabd9853]
int pgm_read(char *filename, unsigned char *pimage){
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL){
printf("ファイル%sが開けません\n",filename);
exit(-1);
}
fscanf(fp,"P5\n128 128\n255\n");
fread(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
**PGM書き出し関数 [#x4461773]
int pgm_write(char *filename, unsigned char *pimage){
FILE *fp;
fp=fopen(filename,"wb");
fprintf(fp,"P5\n128 128\n255\n");
fwrite(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
*サンプルプログラム [#q66e1ae6]
画像をシフトするプログラム。
#include <stdio.h>
#include <stdlib.h>
int pgm_read(char *filename, unsigned char *pimage);
int pgm_write(char *filename, unsigned char *pimage);
void shift(unsigned char *before, unsigned char *after, int x, int y);
int main(void){
unsigned char *image;
unsigned char *after;
int i,j;
image = malloc(sizeof(char)*128*128);
after = malloc(sizeof(char)*128*128);
pgm_read("lenna.pgm", image);
shift(image, after, 40, 40);
pgm_write("after.pgm", after);
free(image);
free(after);
return 0;
}
int pgm_read(char *filename, unsigned char *pimage){
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL){
printf("ファイル%sが開けません\n",filename);
exit(-1);
}
fscanf(fp,"P5\n128 128\n255\n");
fread(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
int pgm_write(char *filename, unsigned char *pimage){
FILE *fp;
fp=fopen(filename,"wb");
fprintf(fp,"P5\n128 128\n255\n");
fwrite(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
void shift(unsigned char *before, unsigned char *after, int x, int y) {
int i,j;
for(i=0;i<128;i++) {
for(j=0;j<128;j++) {
int xcoord = j+x;
int ycoord = i+y;
xcoord = (xcoord >= 128) ? xcoord-128 : xcoord;
ycoord = (ycoord >= 128) ? ycoord-128 : ycoord;
after[i*128+j] = before[ycoord*128+xcoord];
}
}
return;
}
**実行結果 [#v12c3703]
&ref(lenna.png);
&ref(after.png);
終了行:
[[並列処理輪講2009]]
*PGMを使った画像処理プログラム [#l950c89a]
モノクロの画像を扱うPGMファイルのヘッダにはマジックナンバー"P5"と画像の大きさ、階調を定義する。
あとは、単純にモノクロの画素の値を与えてやれば良い。
**PGM読み出し関数 [#wabd9853]
int pgm_read(char *filename, unsigned char *pimage){
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL){
printf("ファイル%sが開けません\n",filename);
exit(-1);
}
fscanf(fp,"P5\n128 128\n255\n");
fread(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
**PGM書き出し関数 [#x4461773]
int pgm_write(char *filename, unsigned char *pimage){
FILE *fp;
fp=fopen(filename,"wb");
fprintf(fp,"P5\n128 128\n255\n");
fwrite(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
*サンプルプログラム [#q66e1ae6]
画像をシフトするプログラム。
#include <stdio.h>
#include <stdlib.h>
int pgm_read(char *filename, unsigned char *pimage);
int pgm_write(char *filename, unsigned char *pimage);
void shift(unsigned char *before, unsigned char *after, int x, int y);
int main(void){
unsigned char *image;
unsigned char *after;
int i,j;
image = malloc(sizeof(char)*128*128);
after = malloc(sizeof(char)*128*128);
pgm_read("lenna.pgm", image);
shift(image, after, 40, 40);
pgm_write("after.pgm", after);
free(image);
free(after);
return 0;
}
int pgm_read(char *filename, unsigned char *pimage){
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL){
printf("ファイル%sが開けません\n",filename);
exit(-1);
}
fscanf(fp,"P5\n128 128\n255\n");
fread(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
int pgm_write(char *filename, unsigned char *pimage){
FILE *fp;
fp=fopen(filename,"wb");
fprintf(fp,"P5\n128 128\n255\n");
fwrite(pimage,sizeof(char),128*128,fp);
fclose(fp);
return 0;
}
void shift(unsigned char *before, unsigned char *after, int x, int y) {
int i,j;
for(i=0;i<128;i++) {
for(j=0;j<128;j++) {
int xcoord = j+x;
int ycoord = i+y;
xcoord = (xcoord >= 128) ? xcoord-128 : xcoord;
ycoord = (ycoord >= 128) ? ycoord-128 : ycoord;
after[i*128+j] = before[ycoord*128+xcoord];
}
}
return;
}
**実行結果 [#v12c3703]
&ref(lenna.png);
&ref(after.png);
ページ名: