問題
画像をRGBレイヤーに分解し、Rレイヤーだけ閾値処理をおこなってから、
レイヤーを再集合させ、カラー画像を作成せよ。
画像
答え
#include <cstdio>
#include <cv.h>
#include <highgui.h>
int main(int argc, char *argv[])
{
IplImage* IN_Img = NULL;
IplImage* R_channelImg = NULL;
IplImage* G_channelImg = NULL;
IplImage* B_channelImg = NULL;
IplImage* OUT_Img = NULL;
IN_Img=cvLoadImage("test2.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(IN_Img==NULL){
printf("Can't Load File !\n");
exit(0);
}
R_channelImg = cvCreateImage(cvGetSize(IN_Img),IPL_DEPTH_8U,1);
G_channelImg = cvCreateImage(cvGetSize(IN_Img),IPL_DEPTH_8U,1);
B_channelImg = cvCreateImage(cvGetSize(IN_Img),IPL_DEPTH_8U,1);
/*RGB分解*/
cvCvtPixToPlane(IN_Img,B_channelImg,G_channelImg,R_channelImg,0);
OUT_Img = cvCloneImage(IN_Img);
cvReleaseImage(&IN_Img );
cvThreshold(R_channelImg, R_channelImg, 128, 255, CV_THRESH_BINARY);
/*再集合*/
cvCvtPlaneToPix(B_channelImg,G_channelImg,R_channelImg,0,OUT_Img);
cvNamedWindow("GREEN", CV_WINDOW_AUTOSIZE);
cvNamedWindow("RED_Threshold", CV_WINDOW_AUTOSIZE);
cvNamedWindow("BLUE", CV_WINDOW_AUTOSIZE);
cvNamedWindow("RGB", CV_WINDOW_AUTOSIZE);
cvShowImage("GREEN", G_channelImg );
cvShowImage("RED_Threshold", R_channelImg );
cvShowImage("BLUE", B_channelImg );
cvShowImage("RGB", OUT_Img );
cvWaitKey(0);
cvReleaseImage(&R_channelImg);
cvReleaseImage(&G_channelImg);
cvReleaseImage(&B_channelImg);
cvDestroyWindow("RGB");
cvDestroyWindow("BLUE");
cvDestroyWindow("RED_Threshold");
cvDestroyWindow("GREEN");
}
メモ
RGB分解部分は、
cvCvtPixToPlane(IN_Img,B_channelImg,G_channelImg,R_channelImg,0);
↓
cvSplit(IN_Img,B_channelImg,G_channelImg,R_channelImg,0);
でもOK。
再集合部分は、
cvCvtPlaneToPix(B_channelImg,G_channelImg,R_channelImg,0,OUT_Img);
↓
cvMerge(B_channelImg,G_channelImg,R_channelImg,0,OUT_Img);
でもOK。