У меня есть эта задача в обмене цветами изображения. Изменение синего на красный, красный на зеленый и зеленый на синий. Я пробовал 3 подхода, но все они потерпели неудачу. Ниже приведены три подхода.Манипуляция цветом путем замены RGB
Разделение RGB для получения их значений и их замены. Все, что у меня есть, это BW-изображения.
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include "rgb.h"
using namespace std;
int main()
{
char infname[256];
cout << "Enter input image : ";
cin >> infname;
IplImage *img = cvLoadImage(infname, 0);
RgbImage pic(img);
int H = img->height;
int W = img->width;
IplImage* channelRed = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* channelGreen = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* channelBlue = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* blue = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* green = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* red= cvCreateImage(cvGetSize(img), 8, 1);
cvSplit(img, channelBlue, channelGreen, channelRed, NULL);
cvThreshold(channelBlue, blue, 20, 255, CV_THRESH_BINARY);
cvThreshold(channelGreen, green, 20, 255, CV_THRESH_BINARY);
cvThreshold(channelRed, red, 20, 255, CV_THRESH_BINARY);
cvShowImage("original", img);
cvShowImage("blue", blue);
cvShowImage("green", green);
cvShowImage("red", red);
cvWaitKey(0);
return 0;
}
2-й, непосредственно перестановкой значений RGB, просто делая выход [J], [I] .r = Pic [J] [I] .g
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include "rgb.h"
using namespace std;
int main(){
IplImage *img = NULL, *out = NULL;
img = cvLoadImage("rgb.jpg");
RgbImage pic(img);
RgbImage outpic(out);
int H = img -> height;
int W = img -> width;
for(int j=0;j<H;j++){
for(int i=0;i<W;i++){
pic[j][i].r = outpic[j][i].g;
pic[j][i].g = outpic[j][i].b;
pic[j][i].b = outpic[j][i].r;
}
}
cvNamedWindow("image", CV_WINDOW_AUTOSIZE);
cvShowImage("image", img);
cvNamedWindow("Output", CV_WINDOW_AUTOSIZE);
cvShowImage("Output", out);
cvWaitKey(0);
cvReleaseImage(&img);
}
, наконец, создавая синий, красный , и зеленые изображения фильтров с одинаковым размером, заполненные 255-м в интересующем канале, и все нули в других каналах для получения значений RGB и их интерганг. Все, что у меня есть, - это 3 изображения с заполненным синим, красным и зеленым цветом. и сделал введенное изображение BW.
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include "rgb.h"
#include <cmath>
using namespace std;
int main()
{
char infname[256];
cout << "Enter input image : ";
cin >> infname;
IplImage *img = cvLoadImage(infname, 0);
RgbImage pic(img);
int H = img->height;
int W = img->width;
IplImage* redfilter = cvCreateImage(cvGetSize(img),8,3);
IplImage* greenfilter = cvCreateImage(cvGetSize(img),8,3);
IplImage* bluefilter = cvCreateImage(cvGetSize(img),8,3);
for (int y=0;y<H;y++)
for (int x=0;x<W;x++) {
CV_IMAGE_ELEM(redfilter,unsigned char, y, 3*x + 0) = 0;
CV_IMAGE_ELEM(redfilter,unsigned char, y, 3*x + 1) = 0;
CV_IMAGE_ELEM(redfilter,unsigned char, y, 3*x + 2) = 255;
}
for (int y=0;y<H;y++)
for (int x=0;x<W;x++) {
CV_IMAGE_ELEM(greenfilter,unsigned char, y, 3*x + 0) = 0;
CV_IMAGE_ELEM(greenfilter,unsigned char, y, 3*x + 1) = 255;
CV_IMAGE_ELEM(greenfilter,unsigned char, y, 3*x + 2) = 0;
}
for (int y=0;y<H;y++)
for (int x=0;x<W;x++) {
CV_IMAGE_ELEM(bluefilter,unsigned char, y, 3*x + 0) = 255;
CV_IMAGE_ELEM(bluefilter,unsigned char, y, 3*x + 1) = 0;
CV_IMAGE_ELEM(bluefilter,unsigned char, y, 3*x + 2) = 0;
}
cvShowImage("original", img);
cvShowImage("red", redfilter);
cvShowImage("green", greenfilter);
cvShowImage("blue", bluefilter);
cvWaitKey(0);
return 0;
}
Я знаю, что все эти подходы ошибочны. Пожалуйста, проинструктируйте меня, что делать, чтобы изменить цвета введенного изображения.
Спасибо.
Вы можете использовать [ 'cvMixChannels'] (Http: // Docs .opencv.org/modules/core/doc/operations_on_arrays.html? highlight = mixchannels # mixchannels) для обмена каналами изображения. – sgarizvi