我想改变图像的亮度,只访问像素值。不使用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);
(更快,更安全,&这也会正确饱和!)