我的图像包含灰度渐变和另一种颜色。我试图用opencv将图像转换为灰度,我也希望源图像中的彩色像素在输出灰度图像中变得相当亮,与颜色本身无关。
根据opencv docs的说法,常见的光度公式为0.299R + 0.587G + 0.114B,因此它对不同的颜色有不同的亮度。
我认为解决方案是在光度公式中设置一些自定义权重。 在opencv中有可能吗?或者可能有更好的方法来进行这种选择性去饱和作用?
我使用python,但没关系
答案 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