【问题标题】:Convert image to grayscale with custom luminosity formula使用自定义亮度公式将图像转换为灰度
【发布时间】:2014-04-23 00:57:45
【问题描述】:

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

根据 opencv 文档,常见的亮度公式类似于 0.299R+0.587G+0.114B,因此它为不同颜色提供了非常不同的亮度。

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

我用python,不过没关系

【问题讨论】:

    标签: opencv


    【解决方案1】:

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

    【讨论】:

    • 哇,太好了!谢谢
    【解决方案2】:

    所以你有自定义公式,

    加载源,

    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
    

    【讨论】:

    • 谢谢!但是每像素循环对性能的影响非常严重。是否可以在没有每像素循环的情况下做到这一点?
    • 是的,但是你可以在documentation看到一些有效的方法
    • @allchemist 您使用的任何方法都必须适用于每个像素。但是,.at() 对性能特别不利,而且原始 for 循环通常是不好的形式。请参阅我的答案,了解可能在 Python 中表现更好的内容。
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2021-06-06
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多