OpenCV使用图像格式BGR(蓝色,绿色红色)
当你写这行时:
image.at<Vec3b>(i, j) = (255, 255, 255);
它等同于:
image.at<Vec3b>(i, j) = (255);
(看到 这个答案 解释原因。)
其中只设置第一个通道,最大值为蓝色。
您需要做的是编辑整个像素,如下所示:
// get pixel Vec3b color = image.at<Vec3b>(Point(x,y)); color[0] = 255; color[1] = 255; color[2] = 255; // set pixel image.at<Vec3b>(Point(x,y)) = color;
借用这个答案
所以你的代码需要看起来像这样:
cv::Mat image(Size(w, h), CV_8UC3, cv::Scalar(0, 0, 255)); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { int pixel_v = (int)imggray.at<uchar>(i,j); if (pixel_v < 200) { int pixel_bl = (int)imgBool.at<uchar>(i, j); if (pixel_bl > 200) { //HERE A WANT WHITE PIXELS, but they are blue Vec3b color = image.at<Vec3b>(Point(i,j)); color[0] = 255; color[1] = 255; color[2] = 255; image.at<Vec3b>(Point(i,j)) = color; } else { image.at<Vec3b>(i, j) = (0, 0, 0); } } } }