Измерение разницы цвета от ROI в изображении с использованием разницы цвета DeltaE - PullRequest
0 голосов
/ 15 апреля 2020
  1. Мне нужно прочитать одно изображение RGB
  2. , затем мне нужно выбрать ROI
  3. После этого мне нужно измерить разницу в цвете ROI для всего изображения, используя простая цветовая сегментация (без использования изображения HSV, меня просят преобразовать RGB в лабораторное изображение)
  4. будет вывод, область интереса будет выделена, а фон будет серым.
  5. простая цветовая сегментация с Разница в цвете deltaE необходима при использовании python.
  6. после сегментации цвета в маске может быть несколько объектов.
  7. тогда я получаю указание проанализировать глубину ROI и сегментируйте ROI в соответствии со значением глубины ROI. Но здесь невозможно получить дельту по всему изображению. пожалуйста, помогите, мне это очень нужно.

    У меня есть это изображение для работы, отсюда мне нужно сегментировать часть жеста рукой: [введите описание изображения здесь] [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()
    

    '' 'Показывает полное выходное изображение белого цвета. Я не понимаю, что делать. Пожалуйста, помогите

1 Ответ

0 голосов
/ 15 апреля 2020

Ваш DeltaE отображается белым, потому что вы поместили массив float64 со значениями ниже 230 в 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», кстати.

Я не понимаю, почему вы используете для этого три разные библиотеки обработки изображений.

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 выглядит так странно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...