【问题标题】:OpenCV: how to apply rainbow gradient map on an image?OpenCV:如何在图像上应用彩虹渐变图?
【发布时间】:2012-04-20 11:26:02
【问题描述】:

假设我们有一张通过 openCV 以某种方式修改过的图像:

现在我们很想申请它Gradient Map (like one we can apply via photoshop)

所以我想知道如何通过 openCV 应用渐变图(彩虹色)?

【问题讨论】:

  • 好吧,对OpenCV一无所知,但这个过程分为两部分,RGB到灰度,然后使用该渐变灰度回到RGB。第一部分见here,第二部分见here

标签: c++ c opencv gradient


【解决方案1】:

现在存在名为applyColorMap 的openCV 函数,它使这个过程变得微不足道。下面的代码可以解决问题

image_cm = cv2.applyColorMap(image, cv2.COLORMAP_JET))

结果如下:

图 1:原始飞机 图2:应用颜色图后的平面

【讨论】:

    【解决方案2】:

    这是一种使用 Python 创建假/伪彩色图像的方法,转换为 c++ 应该非常简单。概述:

    1. 以灰度和 RGB 格式打开您的图像
    2. 将 RGB 图像转换为 HSV(色相、饱和度、值/亮度)色彩空间。这是一个圆柱形空间,色调由极轴上的单个值表示。
    3. 将色调通道设置为我们已经打开的灰度图像,这是关键的一步。
    4. 将通道值和饱和度都设置为最大值。
    5. 转换回 RGB 空间(否则显示不正确)。

    虽然有几个问题...

    1. 由于色调以度为单位,色谱从 0 到 180 表示(不是 0-256 也不是 0-360(有时是这种情况)),我们需要通过乘以 180 / 256.0 来适当地重新调整灰度图像
    2. 在 opencv 情况下,色调色阶从蓝色开始(不是红色,如您的图像中所示)。 IE。映射如下:

    从: 到:

    如果这对改变很重要,我们可以通过偏移所有色调元素并将它们环绕在 180 左右来实现(否则它会饱和)。代码通过在这个截止点屏蔽图像然后适当地偏移来做到这一点。使用 120 的偏移量,生成您的色阶:

    从: 到:

    并且以这种方式处理的图像似乎与您的图像非常匹配(最后)。

    import cv
    
    image_bw = cv.LoadImage("TfBmw.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
    image_rgb = cv.LoadImage("TfBmw.jpg")
    
    #create the image arrays we require for the processing
    hue=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
    sat=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
    val=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
    mask_1=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
    mask_2=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
    
    #convert to cylindrical HSV color space
    cv.CvtColor(image_rgb,image_rgb,cv.CV_RGB2HSV)
    #split image into component channels
    cv.Split(image_rgb,hue,sat,val,None)
    #rescale image_bw to degrees
    cv.ConvertScale(image_bw, image_bw, 180 / 256.0)
    #set the hue channel to the greyscale image
    cv.Copy(image_bw,hue)
    #set sat and val to maximum
    cv.Set(sat, 255)
    cv.Set(val, 255)
    
    #adjust the pseudo color scaling offset, 120 matches the image you displayed
    offset=120
    cv.CmpS(hue,180-offset, mask_1, cv.CV_CMP_GE)
    cv.CmpS(hue,180-offset, mask_2, cv.CV_CMP_LT)
    cv.AddS(hue,offset-180,hue,mask_1)
    cv.AddS(hue,offset,hue,mask_2)
    
    #merge the channels back
    cv.Merge(hue,sat,val,None,image_rgb)
    #convert back to RGB color space, for correct display
    cv.CvtColor(image_rgb,image_rgb,cv.CV_HSV2RGB)
    
    cv.ShowImage('image', image_rgb)
    # cv.SaveImage('TfBmw_120.jpg',image_rgb)
    cv.WaitKey(0)
    

    您的图片使用offset = 120处理:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-14
    • 2011-01-18
    • 2017-10-05
    • 1970-01-01
    • 2015-11-10
    • 2013-11-11
    • 2023-03-21
    • 2021-12-28
    相关资源
    最近更新 更多