0

对 C++ 相当陌生,我一直在使用 OpenCV 库。我正在尝试为图像查看器创建调光功能。这是 的主体void dim(int val)

我循环遍历每个像素,获取对 Vec3b 中像素的 RGB 值的引用,然后将它们减少一些变化因子,从val / 255(where 0 <= val <= 255. 但由于某种原因pix[0]等都被设置为 0,这意味着对于图像的任何值都会val变黑。

可能在这里用浮点做一些有点愚蠢的事情,或者误解了 OpenCV 的某些方面;但我看不到它是什么。

for(int x = 0; x < rows; x++) {
    for(int y = 0; y < cols; y++) {
        Vec3b &pix = dst.at<Vec3b>(x,y);

        float change = val / 255.0f;
        pix[0] = (uchar)(pix[0] * change);
        pix[1] = (uchar)(pix[1] * change);
        pix[2] = (uchar)(pix[2] * change);
    }
}

提前致谢!

4

2 回答 2

1

OpenCV 有一个关于改变图像对比度和亮度的文档。一般来说,它适用alpha * pixel_value + beta于每个像素。由于您只需要调整图像的亮度,alpha因此可以设置1.0。这是修改后的dim()功能。

// negative beta dims image
void dim(Mat& src, Mat& dst, int beta) {
    for(int y = 0; y < src.rows; y++) {
        for(int x = 0; x < src.cols; x++) {
            for(int channel = 0; channel < 3; channel++) {
                dst.at<Vec3b>(y, x)[channel] = saturate_cast<uchar>(src.at<Vec3b>(y, x)[channel] + beta);
            }
        }
    }
}

如果有兴趣,请阅读saturate_cast的作用。

测试上面的功能:

int main( int argc, char** argv )
{
    int beta;
    Mat src = imread(...);
    Mat dst = Mat::zeros(src.size(), src.type());
    namedWindow("src", CV_WINDOW_AUTOSIZE);
    imshow("src", src);
    dim(src, dst, -200);
    namedWindow("dst", CV_WINDOW_AUTOSIZE);
    imshow("dst", dst);

    waitKey(0);
    return 0;
}
于 2013-11-05T00:51:43.207 回答
0

如果您将整数值乘以/除以小于 1 的实数值,您将得到 0,因为您的比例系数将被截断为整数。要纠正您的问题,您应该在缩放时将 pix[] 转换为 float 或 double 并将结果转换回 char。

于 2013-11-04T14:25:19.837 回答