화상 처리 100개 노크 C언어로 도전해 보자 #3
Q.3. 이진화
이미지를 이진화하라. 2진화란, 화상을 흑백의 2치로 표현하는 방법이다. 여기서, 그레이 스케일에서 임계 값을 128로 설정하고 다음 방정식으로 이진화한다.
y = { 0 (if y < 128)
255 (else)
입력
출력
답변
이진화할 부분의 코드입니다.
이번에도 출력 부분과 정리했습니다.
ex3.cdouble image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
if((int)image_gry[i][k] < 128){
fprintf(outfp, "0 ");
}else{
fprintf(outfp, "255 ");
}
k ++;
}
fprintf(outfp, "\n");
}
해설
두 번째 질문에 조금 손을 넣었을 뿐입니다.
출력할 때에 0이나 255로 분류할 뿐이므로, fprintf
를 경우 나누어 안에 넣어 주어, image_gray
의 값이 128 미만인지 아닌지로 분기시킵니다.
완성된 프로그램(전문)
ex3.c#include <stdio.h>
#define N 256
int main(void) {
FILE *infp;
FILE *outfp;
char magic[64];
char str[256];
int width;
int height;
int max;
char readline[N] = {'\0'};
infp = fopen("../imori.ppm", "r");
//magic
fgets(magic, N, infp);
//width, height
int num[4];
for(int i = 0; i < 2; i ++){
fscanf(infp, "%d", &num[i]);
}
width = num[0];
height = num[1];
//max
fscanf(infp, "%d", &max);
//image
double image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%lf", &image[i][j]);
}
}
outfp = fopen("imori.pgm", "w");
fprintf(outfp, "P2\n");
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
if((int)image_gry[i][k] < 128){
fprintf(outfp, "0 ");
}else{
fprintf(outfp, "255 ");
}
k ++;
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/90845c48582a036fc0cd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이진화할 부분의 코드입니다.
이번에도 출력 부분과 정리했습니다.
ex3.c
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
if((int)image_gry[i][k] < 128){
fprintf(outfp, "0 ");
}else{
fprintf(outfp, "255 ");
}
k ++;
}
fprintf(outfp, "\n");
}
해설
두 번째 질문에 조금 손을 넣었을 뿐입니다.
출력할 때에 0이나 255로 분류할 뿐이므로, fprintf
를 경우 나누어 안에 넣어 주어, image_gray
의 값이 128 미만인지 아닌지로 분기시킵니다.
완성된 프로그램(전문)
ex3.c#include <stdio.h>
#define N 256
int main(void) {
FILE *infp;
FILE *outfp;
char magic[64];
char str[256];
int width;
int height;
int max;
char readline[N] = {'\0'};
infp = fopen("../imori.ppm", "r");
//magic
fgets(magic, N, infp);
//width, height
int num[4];
for(int i = 0; i < 2; i ++){
fscanf(infp, "%d", &num[i]);
}
width = num[0];
height = num[1];
//max
fscanf(infp, "%d", &max);
//image
double image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%lf", &image[i][j]);
}
}
outfp = fopen("imori.pgm", "w");
fprintf(outfp, "P2\n");
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
if((int)image_gry[i][k] < 128){
fprintf(outfp, "0 ");
}else{
fprintf(outfp, "255 ");
}
k ++;
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/90845c48582a036fc0cd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ex3.c
#include <stdio.h>
#define N 256
int main(void) {
FILE *infp;
FILE *outfp;
char magic[64];
char str[256];
int width;
int height;
int max;
char readline[N] = {'\0'};
infp = fopen("../imori.ppm", "r");
//magic
fgets(magic, N, infp);
//width, height
int num[4];
for(int i = 0; i < 2; i ++){
fscanf(infp, "%d", &num[i]);
}
width = num[0];
height = num[1];
//max
fscanf(infp, "%d", &max);
//image
double image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%lf", &image[i][j]);
}
}
outfp = fopen("imori.pgm", "w");
fprintf(outfp, "P2\n");
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
if((int)image_gry[i][k] < 128){
fprintf(outfp, "0 ");
}else{
fprintf(outfp, "255 ");
}
k ++;
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/90845c48582a036fc0cd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fuwasegu/items/90845c48582a036fc0cd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)