【问题标题】:Measuring color difference from an ROI within the image using DeltaE color difference?使用 DeltaE 色差测量图像中 ROI 的色差?
【发布时间】:2020-07-28 01:29:09
【问题描述】:
  1. 我必须读取一张 RGB 图像
  2. 那么我需要选择一个 ROI
  3. 之后,我需要使用简单的方法从整个图像中测量 ROI 的色差 颜色分割(不使用 HSV 图像,要求我将 RGB 转换为 Lab 图像)
  4. 输出为,ROI 突出显示,背景为灰色。
  5. 需要使用python进行简单的deltaE色差颜色分割。
  6. 颜色分割后,蒙版中可能存在多个对象。
  7. 然后我被指示分析 ROI 的深度并根据深度对 ROI 进行分段 投资回报率的价值。 但是在这里也不可能在整个图像上获得 deltaE。 请帮忙,我非常需要它。

    我要处理这张图片,从这里我需要分割手势部分: [在此处输入图片说明][1]

    [1]:https://i.stack.imgur.com/nGA42.jpg

    到目前为止,我已经编写了代码: ''''

    # Open image and make Numpy arrays 'rgb' and 'lab'
    pic = imageio.imread('E:\JU_V2_DIGIT\RGB_Crop\RGB_P7_G0_8.png')
    pic2 = pic.copy()
    # Determine the shape of the image
    total_row, total_col, layers = pic2.shape
    mask= np.zeros_like(pic2)
    x,y = np.ogrid[:total_row, :total_col]
    # Transform in lab picture
    Lab_pic = color.rgb2lab(pic)
    L_pic, A_pic, B_pic = cv2.split(Lab_pic)
    
    
    cv2.imshow("L_Channel", L_pic)  # For L Channel
    cv2.imshow("A_Channel", A_pic)  # For A Channel
    cv2.imshow("B_Channel", B_pic)  # For B Channel
    
    cen_x, cen_y = total_row/2, total_col/2
    distance_from_center = np.sqrt((x-cen_x+10)**2+(y-cen_y-15)**2)
    radius = (total_row/3)
    circular_pic = distance_from_center>radius
    pic2[circular_pic] = 0
    pic2[mask] = 0
    #cv2.imwrite('D:\SHROUTI\Testpictures\opencvmasking_human.jpg',dst)
    cv2.imshow("cir_mask",pic2)
    Lab = color.rgb2lab(pic2)
    
    #getting mean value for the mask region
    L_mask,A_mask,B_mask = cv2.split(Lab)
    
    cv2.imshow("L_Channel_mask", L_mask)  # For L Channel
    cv2.imshow("A_Channel_mask", A_mask)  # For A Channel
    cv2.imshow("B_Channel_mask", B_mask)  # For B Channel
    
    LMean = L_mask.mean()
    AMean = A_mask.mean()
    BMean = B_mask.mean()
    
    
    # getting delta values
    DeltaL = L_pic-LMean
    DeltaA = A_pic- AMean
    DeltaB = B_pic - BMean
    
    DeltaE = np.sqrt(pow(DeltaA,2)+pow(DeltaB,2)+pow(DeltaL,2))
    print(DeltaE)
    cv2.imshow("deltaE",DeltaE)
    cv2.waitKey()
    

    ''' 它显示了一个完整的白色输出图像。我不知道该怎么做。请帮忙

【问题讨论】:

  • 为什么要使用多个图像处理库?为什么不在opencv中打开并转换图像呢?
  • 除了显示问题,请考虑重新阅读问题描述。您的实现表明您可能并不真正理解它的要求。例如,为什么要计算整个图像的平均值?您只需要 ROI 的平均值

标签: python opencv image-processing euclidean-distance


【解决方案1】:

您的 DeltaE 显示为白色,因为您将值低于 230 的 float64 数组放入 cv2.imshow()

它期望所有值都在 [0,1] 范围内。在您的情况下,每个 >= 1 的值都变为 255,因此您的输出图像全是白色的。

normalized = cv2.normalize(DeltaE, None, 0, 1, cv2.NORM_MINMAX)

normalized = cv2.normalize(DeltaE, None, 0, 255, cv2.NORM_MINMAX, dtype = cv2.CV_8U)

获取DeltaE 的标准化版本,您可以毫无问题地显示。

通过单击 google 的第一个“imshow white”btw 找到解决方案。

我不明白您为什么为此使用三个不同的图像处理库。

OpenCV 满足您的所有需求。

替换pic = imageio.imread('E:\JU_V2_DIGIT\RGB_Crop\RGB_P7_G0_8.png')

pic = cv2.imread('E:\JU_V2_DIGIT\RGB_Crop\RGB_P7_G0_8.png')

Lab_pic = color.rgb2lab(pic)

Lab = cv2.cvtColor(pic2, cv2.COLOR_BGR2Lab)

等等……

无需冒奇怪的风险,因为一个库在 BRG 中工作,而另一个库在 RGB 或其他中工作。以防万一您想知道为什么您的 rgb 图像看起来如此怪异。

【讨论】:

    猜你喜欢
    • 2016-08-05
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多