Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以自己的色调显示颜色通道?_C#_Opencv_Emgucv - Fatal编程技术网

C# 如何以自己的色调显示颜色通道?

C# 如何以自己的色调显示颜色通道?,c#,opencv,emgucv,C#,Opencv,Emgucv,从图像中提取特定颜色通道时,EMGU CV中使用以下代码: EMGU.CV.UI.ImageBox originalImage; EMGU.CV.UI.ImageBox bChannel; ... Image<Bgra, Byte> image = new Image<Bgra, Byte>(filename); originalImage = image; bChannel = image[0]; // Index 0 is the blue channel (for

从图像中提取特定颜色通道时,EMGU CV中使用以下代码:

EMGU.CV.UI.ImageBox originalImage;
EMGU.CV.UI.ImageBox bChannel;
...
Image<Bgra, Byte> image = new Image<Bgra, Byte>(filename);
originalImage = image;
bChannel = image[0]; // Index 0 is the blue channel (for BGRA).
EMGU.CV.UI.ImageBox原始图像;
EMGU.CV.UI.ImageBox b通道;
...
图像=新图像(文件名);
原始图像=图像;
b通道=图像[0];//索引0是蓝色通道(用于BGRA)。
不幸的是,分配给
ImageBox b频道的结果图像是灰度的,而不是蓝色的。如何以自己的色调(在本例中为蓝色)显示图像

最后,我想设计一个与以下类似的UI:



PS:根据EMGU是该库的包装器的推理,使用“OpenCV”标记对该问题进行额外标记。:)

发布我的问题后,我意识到我可以通过将所有其他通道值设置为0(黑色)来隔离通道。这是我的密码:

Image<Bgra, Byte> img = new Image<Bgra, Byte>(filename);
Image<Bgra, Byte> blue = img.Copy();
Image<Bgra, Byte> green = img.Copy();
Image<Bgra, Byte> red = img.Copy();
Bgra tmp;
double saveGreen;
double saveRed;

for (int ii = 0; ii < img.Height; ii++)
{
    for (int jj = 0; jj < img.Width; jj++)
    {
        tmp = img[ii,jj];
        saveGreen = tmp.Green;
        saveRed = tmp.Red;

        // Blue
        tmp.Green = 0;
        tmp.Red = 0;
        blue[ii,jj] = tmp;

        // Green
        tmp.Green = saveGreen;
        tmp.Blue = 0;
        green[ii, jj] = tmp;

        // Red
        tmp.Red = saveRed;
        tmp.Green = 0;
        red[ii,jj] = tmp;
    }
}

imageBox1.Image = img;
imageBox2.Image = blue;
imageBox3.Image = green;
imageBox4.Image = red;
Image img=新图像(文件名);
Image blue=img.Copy();
图像绿色=img.Copy();
图像红色=img.Copy();
Bgra tmp;
双绿色;
双重储蓄;
对于(int ii=0;ii
生成的UI如下所示:

如果您认为生成的频道图像看起来不正确,或者您可以想出一种更快的方法而不必访问每个像素,请发布答案或评论

编辑ED PLUNKETT的以下评论:

我实现了以下用于设置通道颜色的代码:

Bgra tmp;
Bgra save;

for (int ii = 0; ii < img.Height; ii++)
{
    for (int jj = 0; jj < img.Width; jj++)
    {
        tmp = img[ii,jj];
        save = tmp;

        // Red channel.

        if (tmp.Red == 255)
        {
            tmp.Blue = tmp.Green = 255;
        }
        else
            if (tmp.Red == 0)
            {
                tmp.Blue = tmp.Green = 0;
            }
            else
                if (tmp.Red < 128)
                {
                    tmp.Blue = tmp.Green = tmp.Red / 2;
                }

        red[ii, jj] = tmp;

        // Green channel.

        tmp = save;

        if (tmp.Green == 255)
        {
            tmp.Blue = tmp.Red = 255;
        }
        else
            if (tmp.Green == 0)
            {
                tmp.Blue = tmp.Red = 0;
            }
            else
                if (tmp.Green < 128)
                {
                    tmp.Blue = tmp.Red = tmp.Green / 2;
                }

        green[ii, jj] = tmp;

        // Blue channel.

        tmp = save;

        if (tmp.Blue == 255)
        {
            tmp.Green = tmp.Red = 255;
        }
        else
            if (tmp.Blue == 0)
            {
                tmp.Green = tmp.Red = 0;
            }
            else
                if (tmp.Blue < 128)
                {
                    tmp.Green = tmp.Red = tmp.Blue / 2;
                }

        blue[ii, jj] = tmp;
    }
}
bgratmp;
Bgra保存;
对于(int ii=0;ii
此外,我还使用了沙漠图像并移动了通道,使其顺序与示例图像中的RGB顺序相匹配。以下是输出:

这不太一样(红色通道太像原始图像),但总体上看起来更像沙漠图片样本中使用的分割

编辑ED PLUNKETT的以下回答:

以下是pow=1.5的输出:

功率=2.0时的输出:

功率=2.5时的输出:

功率输出分别为2.0(红色)、2.5(绿色)和1.6(蓝色):


这确实不是我的领域,但没有一个有正确理解的人对此感兴趣,所以不幸的是,你现在只能和我呆在一起

有不止一种“正确”的方法可以做到这一点。您的第一次尝试,将“off-hue”通道设置为零,简单明了,毫无疑问具有隔离颜色通道的效果,但它与沙漠拱门示例的算法完全不同。视觉效果非常不同

为简单起见,我只讨论“隔离”红色通道。同样的原则大致适用于其他两个(稍后将详细介绍)

沙漠拱门的例子大致上保持了整体亮度:原始图像中的白色像素最终成为结果中的白色像素;黑色像素也是如此。R=128的像素应为红色(对于平滑曲线,依此类推)

多红

就我们这里的目的而言,当我们说a颜色是“红色”时,我们的意思是G和B通道是相同的,并且该值小于R。可能会少一点,可能会少很多。当我们在低端接近黑色时,值向零收敛,当我们在高端接近白色时,值向255收敛。在中间,他们分摊相当大的金额(如果有一个规范正确的数额,我希望有人知道比我在某个时刻出现)。它们越分散,你的红色越饱和。曲线看起来有点像高度复杂的技术数据可视化:

下面的曲线描述了一个函数f(R),其中f(0)=0,f(255)=255,f(128)等于小于128的某个数。如果你想把颜色涂成明显的红色,最好少涂一点

当我数到十点的时候,我会脱下鞋子,所以我把上面的图片发到了一位朋友的邮箱里,这位朋友一直穿着鞋子。他提出了以下“幂律”公式:

…其中,
x
是一个指数。如果
x=1.0
,那么
f(R)=R
,这没有多大用处。
1.5的x值
x = 1.5
f(R) = 255 * Math.Pow(R/255, x);
G = B = f(R)
R = B = f(G)
R = G = f(B)