c++ - OpenCV 混合模式实现 : Why do seemingly equivalent operations have different results?

标签 c++ arrays opencv pointers image-processing

我有一个 blendImage、一个 frameImage(来自 JavaCameraView)和一个 maskImage。我需要使用亮化混合模式混合 blendImage 和 frameImage,并应用从 maskImage 计算的 alpha。为此,我预乘计算了变暗的 frameImagePixel 的值并与之进行比较。然而……

for (int i = 0; i < blendImage.rows; i++) {
    uchar *blendImagePixel = blendImage.ptr(i);
    uchar *frameImagePixel = frameImage.ptr(i);
    uchar *maskImagePixel = maskImage.ptr(i);
    int channelsToBlend = min(3, blendImage.channels()); //if it exists, never blend alpha channel
    for (int j = 0; j != blendImage.cols * blendImage.channels(); j += blendImage.channels()) {
        uchar adjustedMaskImagePixel = saturate_cast<uchar>( (maskImagePixel[j] * maskContrast) + maskBrightness);
        for (int c = 0; c < channelsToBlend; c++) {

            float alpha = (float) map(adjustedMaskImagePixel, 0, 255, 0, 1); //if black, alpha = 0
            float beta  = (float) 1.0 - alpha;

            switch (blendMode) {
                case LIGHTEN: {

                    /* THIS WORKS AND I DON'T KNOW WHY */
                    frameImagePixel[j + c]  = (uchar) (frameImagePixel[j + c] * alpha);
                    if (blendImagePixel[j + c] > frameImagePixel[j + c])
                        frameImagePixel[j + c] = blendImagePixel[j + c];

                     /* THIS DOESN'T WORK AND I DON'T KNOW WHY
                    uchar darkenedFrameImagePixel = (uchar) (frameImagePixel[j + c] * alpha);
                    if (blendImagePixel[j + c] > darkenedFrameImagePixel )
                        frameImagePixel[j + c] = blendImagePixel[j + c];
                    */

                    break;
                }
            }
        }
    }
}

当我计算变暗的 frameImagePixel 的值并将其存储在 frameImagePixel 本身时,最终图像是完美的。 但是,当我计算变暗的 frameImagePixel 的值但将其存储在 uchar 中并与该 uchar 变量进行比较时,结果会因颜色损坏而产生噪音 - 基本上是一团糟。 我不明白。这两个措辞似乎是等价的。为什么一个工作完美而另一个坏了?

最佳答案

这些操作看起来并不等同。第一种情况

frameImagePixel[j + c] = (uchar) (frameImagePixel[j + c] * alpha); 

独立于

改变frameImagePixel
if (blendImagePixel[j + c] > frameImagePixel[j + c]) 

每个像素都乘以 alpha。在第二种情况下如果

blendImagePixel[j + c] < darkenedFrameImagePixel 

没有任何反应。并非所有像素都乘以 alpha。这是一个很大的不同。

例子:

第一种情况

frameImagePixel[j + c] = 10
alpha = 0.5
blendImagePixel[j + c] = 0
=> frameImagePixel[j + c] == 5
=> blendImagePixel[j + c] > frameImagePixel[j + c] == false

第二种情况

frameImagePixel[j + c] = 10
alpha = 0.5
blendImagePixel[j + c] = 0
=> darkenedFrameImagePixel == 5
=> blendImagePixel[j + c] > frameImagePixel[j + c] == false
=> frameImagePixel[j + c] == 10

关于c++ - OpenCV 混合模式实现 : Why do seemingly equivalent operations have different results?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58086255/

相关文章:

java - 使用 int 数组的元素初始化字符串

java - PrintWriter[] 数组中的 NullPointerException - Java

c++ - 确定直方图的所有局部最大值的函数

java - 处理 OpenCV 和 QuickTime 视频捕获的问题

c++ - 测试角度是否在范围内(高效且优雅)

c++ - 有什么理由使用这个->

c++ - 如何在 QtCreator 中链接 opencv 并使用 Qt 库

c++ - 针对一组类型专门化许多模板

c# - 将数组打印为表 c#

java - 在javacv中将IplImage转换为Mat