2013-03-11 4 views
0

У меня есть эта задача в обмене цветами изображения. Изменение синего на красный, красный на зеленый и зеленый на синий. Я пробовал 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; 
} 

Я знаю, что все эти подходы ошибочны. Пожалуйста, проинструктируйте меня, что делать, чтобы изменить цвета введенного изображения.

Спасибо.

+0

Вы можете использовать [ 'cvMixChannels'] (Http: // Docs .opencv.org/modules/core/doc/operations_on_arrays.html? highlight = mixchannels # mixchannels) для обмена каналами изображения. – sgarizvi

ответ

0
 pic[j][i].r = outpic[j][i].g; 
     pic[j][i].g = outpic[j][i].b; 
     pic[j][i].b = outpic[j][i].r; 

Это выглядит обратным образом для меня. pic - загруженное изображение. Не следует ли назначать outpic?

+0

исправил его. но все еще не работает. Получена ошибка сегментации. '\t для (Int J = 0; J Abby

0

В первой программе cvThreshold() возвращает черно-белое изображение, как предполагается.

CV_THRESH_BINARY: ДСТ (х, у) = MaxValue, если ЦСИ (х, у)> порог 0, в противном случае

Смежные вопросы