繁体   English   中英

通过互换RGB进行色彩处理

[英]Color Manipulation by Interchanging RGB

我的任务是交换图像的颜色。 将蓝色更改为红色,红色更改为绿色以及绿色更改为蓝色。 我尝试了3种方法,但是所有方法都失败了。 以下是三种方法。

拆分RGB以获取它们的值并交换它们。 我所得到的只是一张黑白照片。

#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;
}

第二,仅通过使output [j] [i] .r = pic [j] [i] .g直接交换RGB值

#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;
}

我知道所有这些方法都是错误的。 请指示我该如何改变输入图像的颜色。

谢谢。

        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吗?

在第一个程序中,cvThreshold()返回了原本应该的黑白图像。

CV_THRESH_BINARY:dst(x,y)= maxValue,如果src(x,y)>阈值0,否则

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM