화상 처리 100개 노크 C언어로 도전해 보자 #1
Q.1. 채널 교환
이미지를 읽고 RGB를 BGR 순서로 바꿉니다.
입력
출력
답변
픽셀의 값을 바꾸는 부분의 코드입니다.
ex1.cint array = 0;
for(int i = 0; i < height; i++){
for(int j = 0; j < width*3-2; j = j+3){
array = image[i][j+2];
image[i][j+2] = image[i][j];
image[i][j] = array;
}
}
해설
RGB의 3개의 값은 각각 2차원 배열에 격납되어 있어, 3개가 가로 정렬되어 있습니다.
이번에는 RGB를 BGR의 순서로 바꾸기 때문에 3가지 중 머리와 엉덩이의 값을 바꾸면 좋다.
따라서, 우선은 3번째의 값(B의 값)을 새롭게 준비한 변수 array에 피난시켜 두고, 1번째의 값(R의 값)으로 덧쓰기합니다. 이 조작으로 RGB가 RGR입니다.
다음으로 대피시킨 B의 값을 첫 번째 값으로 덮어씁니다. 이 조작으로 RGR이 BGR이 되었습니다.
2중 루프를 돌리고 있습니다만, 교환은 3개 1조로 실시하기 때문에, 내부의 for문의 변화식은 2개 날아가 되고 있습니다.
완성된 프로그램(전문)
ex1.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
int image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%d", &image[i][j]);
}
}
outfp = fopen("imori.ppm", "w");
fprintf(outfp, "%s", magic);
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
int array = 0;
for(int i = 0; i < height; i++){
for(int j = 0; j < width*3-2; j = j+3){
array = image[i][j+2];
image[i][j+2] = image[i][j];
image[i][j] = array;
}
}
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fprintf(outfp, "%d ", image[i][j]);
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/7faf698086d09d124706
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
픽셀의 값을 바꾸는 부분의 코드입니다.
ex1.c
int array = 0;
for(int i = 0; i < height; i++){
for(int j = 0; j < width*3-2; j = j+3){
array = image[i][j+2];
image[i][j+2] = image[i][j];
image[i][j] = array;
}
}
해설
RGB의 3개의 값은 각각 2차원 배열에 격납되어 있어, 3개가 가로 정렬되어 있습니다.
이번에는 RGB를 BGR의 순서로 바꾸기 때문에 3가지 중 머리와 엉덩이의 값을 바꾸면 좋다.
따라서, 우선은 3번째의 값(B의 값)을 새롭게 준비한 변수 array에 피난시켜 두고, 1번째의 값(R의 값)으로 덧쓰기합니다. 이 조작으로 RGB가 RGR입니다.
다음으로 대피시킨 B의 값을 첫 번째 값으로 덮어씁니다. 이 조작으로 RGR이 BGR이 되었습니다.
2중 루프를 돌리고 있습니다만, 교환은 3개 1조로 실시하기 때문에, 내부의 for문의 변화식은 2개 날아가 되고 있습니다.
완성된 프로그램(전문)
ex1.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
int image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%d", &image[i][j]);
}
}
outfp = fopen("imori.ppm", "w");
fprintf(outfp, "%s", magic);
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
int array = 0;
for(int i = 0; i < height; i++){
for(int j = 0; j < width*3-2; j = j+3){
array = image[i][j+2];
image[i][j+2] = image[i][j];
image[i][j] = array;
}
}
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fprintf(outfp, "%d ", image[i][j]);
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/7faf698086d09d124706
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ex1.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
int image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%d", &image[i][j]);
}
}
outfp = fopen("imori.ppm", "w");
fprintf(outfp, "%s", magic);
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
int array = 0;
for(int i = 0; i < height; i++){
for(int j = 0; j < width*3-2; j = j+3){
array = image[i][j+2];
image[i][j+2] = image[i][j];
image[i][j] = array;
}
}
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fprintf(outfp, "%d ", image[i][j]);
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/7faf698086d09d124706
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fuwasegu/items/7faf698086d09d124706텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)