用c++改变图像亮度



我想改变图像的亮度,只访问像素值。不使用opencv函数(例如:convertTo)

输入:图像,num

num表示亮度恒定值

是我的代码,结果看起来很奇怪。有什么问题吗?

原来

结果

cv::Mat function(cv::Mat img, int num){
cv::Mat output;
output = cv::Mat::zeros(img.rows, img.cols, img.type());
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
for (int c = 0; c < img.channels(); c++)
{
output.at<cv::Vec3b>(i, j)[c] = img.at<cv::Vec3b>(i, j)[c] + num;

if (output.at<cv::Vec3b>(i, j)[c] > 255){
output.at<cv::Vec3b>(i, j)[c] = 255;
}
else if (output.at<cv::Vec3b>(i, j)[c] < 0)
{
output.at<cv::Vec3b>(i, j)[c] = 0;
}
}

}
}
cv::imshow("output", output);
cv::waitKey(0);
return img;
}

不使用opencv函数

这有点傻,因为你的代码已经使用了opencv的数据结构。

试图这样做,你也重新发明了轮子,虽然有点方形…

赋值输出前检查是否溢出

是的,这就是问题所在。正确的做法是:将和赋值给比uchar大的,然后检查

else if (output.at<cv::Vec3b>(i, j)[c] < 0)

这永远不会发生,试着理解为什么


但是请注意,您的整个代码(三重循环,omg !!)可以重写为一个简单的:

Mat output = img + Scalar::all(num);

(更快,更安全,&这也会正确饱和!)