OpenCV использует формат изображения BGR (синий, зеленый, красный)
Когда вы пишете эту строку:
image.at<Vec3b>(i, j) = (255, 255, 255);
, это эквивалентно:
image.at<Vec3b>(i, j) = (255);
(См. этот SO-ответ , чтобы объяснить, почему.)
Который устанавливает только первый канал на максимум, а это синий.
Что вам нужно сделать, так этоотредактируйте весь пиксель следующим образом:
// 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);
}
}
}
}