我有一个房间的图像,有一个打开的门,我们可以看到另一个房间。
拍摄照片的房间的白色平衡是正确的,但在另一个房间它是关闭的,因为照明是不同的。
我想把正确的白色从原始图像(我使用了一个蒙版)Map到另一个房间的像素(我也有一个蒙版)。
下面是我的代码:
cv::Mat blueMask;
cv::Mat whiteMask;
cv::Mat hsv;
getWhiteColorMask(src, blueMask, whiteMask, hsv);
// Save the HSV image
bool success = cv::imwrite(outputImagePath + "hsv.jpg", hsv);
// Save the white mask image
success = cv::imwrite(outputImagePath + "white_mask.jpg", whiteMask);
success = cv::imwrite(outputImagePath + "blue_mask.jpg", blueMask);
// Apply changes to the blue channel based on the mask
cv::Mat adjustedImage = src.clone(); // Clone the original image for adjustment
for (int row = 0; row < src.rows; ++row) {
for (int col = 0; col < src.cols; ++col) {
// Check if the pixel is in the blue mask
if (blueMask.at<uchar>(row, col) > 0) {
// Get the corresponding pixel in the white mask
cv::Vec3b whitePixel = whiteMask.at<cv::Vec3b>(row, col);
// Adjust the pixel in the blue mask using the white color
cv::Vec3b& bluePixel = adjustedImage.at<cv::Vec3b>(row, col);
bluePixel[0] = whitePixel[0]; // B channel
//bluePixel[1] = whitePixel[1]; // G channel
//bluePixel[2] = whitePixel[2]; // R channel
}
}
}
// Save the modified image with the new file name
std::string newImagePath = "./mask_test/white_masks/adjustedImage.jpg";
success = cv::imwrite(newImagePath, adjustedImage);
我已经删除了所有的验证打印,使代码更短,所以不要打扰我使用的布尔成功
以下是理解问题所需的所有图像:
来源图片:
白色像素遮罩不正确:
正确的白色像素遮罩:
HSV图像:
1条答案
按热度按时间xv8emn3q1#
一般来说,我们必须校正红色/绿色和蓝色/绿色的颜色比率,以匹配另一侧的比率(“白色”的比率)。
没有一个确定性的解决方案适用于所有情况,我们必须使用启发式方法来找到上述每一侧的比率。
为了找到白色(灰色)的比率,我们可以使用白色平衡算法作为Grayworld assumption。
在我的解决方案中,我使用的是“最大RGB”算法的变体(假设R、G、B的高百分位数代表白色像素)。
当应用颜色校正时,RGB值被假定在线性空间中(没有伽马)。
首先,我们应该做的是从sRGB转换到线性RGB颜色空间(反相伽马)。
我们还可以修复掩码以更好地表示左侧和右侧(出于测试目的,我们可以假设我们知道如何完美地分割左侧/右侧)。
在反转伽马并固定掩模之后,我们可以使用以下阶段:
使用蒙版提取右侧的所有红色、绿色、蓝色像素(也未饱和)。
计算左侧R、G、B的上百分位数(比如百分位数95)。
我们假设
(leftRup, leftGup, leftBup)
表示左侧的白色。我们假设
(rightRup, rightGup, rightBup)
代表右侧的白色。MATLAB代码示例:
我们希望以如下方式校正左侧的比率:
leftRup / leftGup = rightRup / rightGup
leftBup / leftGup = rightBup / rightGup
计算左侧红色通道的比例因子。
计算左侧蓝色通道的比例因子。
leftRscale = (rightRup/rightGup) / (leftRup/leftGup)
leftBscale = (rightBup/rightGup) / (leftBup/leftGup)
MATLAB代码示例(抱歉没有使用C++或Python):
输出:
注意事项:
固定红/绿色和蓝/绿的比率是近似值。
有一种更精确的方法称为CAT -Chromatic Adaptation校正。