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

时间:2014-04-22 16:19:50

标签: opencv

我的图像包含灰度渐变和另一种颜色。我试图用opencv将图像转换为灰度,我也希望源图像中的彩色像素在输出灰度图像中变得相当亮,与颜色本身无关。

根据opencv docs的说法,常见的光度公式为0.299R + 0.587G + 0.114B,因此它对不同的颜色有不同的亮度。

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

我使用python,但没关系

2 个答案:

答案 0 :(得分:10)

这是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)

答案 1 :(得分:1)

所以你有自定义公式,

加载来源,

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