我有一个 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/