使用自定义亮度公式将图像转换为灰度



我的图像包含灰度和其他颜色。我试图用opencv将图像转换为灰度,我还希望源图像中的彩色像素在输出灰度图像中变得相当轻,与颜色本身无关。

根据opencv-docs的说法,常见的光度公式是类似于0.299R+0.587G+0.114B的smth,因此它为不同的颜色提供了非常不同的光度。

我认为解决方案是在光度公式中设置一些自定义权重。在opencv中可能吗?或者也许有更好的方法来进行这种选择性去饱和?

我使用python,但并不重要

这是transform()函数的完美情况。您可以将灰度转换视为对输入图像的每个像素应用1x3矩阵变换。此矩阵中的元素分别是蓝色、绿色和红色分量的系数,因为OpenCV图像默认为BGR。

im = cv2.imread(image_path)
coefficients = [1,0,0] # Gives blue channel all the weight
# for standard gray conversion, coefficients = [0.114, 0.587, 0.299]
m = np.array(coefficients).reshape((1,3))
blue = cv2.transform(im, m)

所以你有自定义的公式,

负载源,

Mat src=imread(fileName,1);

创建灰色图像,

Mat gray(src.size(),CV_8UC1,Scalar(0));

现在在一个循环中,访问源类的BGR像素,

Vec3b bgrPixel=src.at<cv::Vec3b>(y,x); //gives you the BGR vector of type cv::Vec3band will be in row, column order
bgrPixel[0]= Blue//
bgrPixel[1]= Green//
bgrPixel[2]= Red//

使用自定义公式计算新的灰度像素值。

最后设置灰度图像上的像素值,

 gray.at<uchar>(y,x) = custom intensity value // will be in row, column order

相关内容

  • 没有找到相关文章

最新更新