R: Установка красного и зеленого значений изображения RGB в ноль, обрабатывая его как матрицу - PullRequest
0 голосов
/ 27 февраля 2020

Я работаю с пакетами OpenImageR и SuperpixelImageSegmentation в R. Я хотел извлечь измерение Green сегментированного изображения, в результате получилось двухмерное изображение вместо 3 (оттенки серого).
поэтому для его раскрашивания я установил значения красного и синего цветного изображения равны 0.
Однако всякий раз, когда я пытаюсь показать изображение, я получаю следующую ошибку, и я не могу понять, почему 0 интерпретируется как NAN, я также пытался установить его на значение, которое больше нуля (0,01), и я все еще получаю то же сообщение:

Error in rgb(t(x[, , 1L]), t(x[, , 2L]), t(x[, , 3L]), maxColorValue = max) : 
  color intensity nan, not in [0,1]

вот мой код:

library(SuperpixelImageSegmentation)
library(OpenImageR)

path = system.file("tmp_images", "Phen.jpg", package = "OpenImageR")

image = readImage(path)
init = Image_Segmentation$new()

segmentation = init$spixel_segmentation(input_image = image,
                                    superpixel = 2000, # k
                                    AP_data = TRUE,
                                    use_median = TRUE,
                                    sim_wA = 5,
                                    sim_wB = 5,
                                    sim_color_radius = 3,
                                    kmeans_method = "kmeans",
                                    kmeans_initializer = "kmeans++",
                                    kmeans_num_init = 5,
                                    kmeans_max_iters = 50,
                                    verbose = TRUE)
#getting the green part alone
imG = segmentation$AP_image_data
imG = imG[,,2]

imB = segmentation$AP_image_data
imB = imB[,,3]

imR = segmentation$AP_image_data
imR = imR[,,1]


imR4 = imR / 2
imB4 = imB / 2
imGDone = imG - imR4
imGDone = imGDone - imB4
imageShow(imGDone)  # works fine, the result is a mask that contains only the green concentrated areas

imGColor <- segmentation$AP_image_data
for (i in 1:nrow(imGDone)) {
  for (j in 1:ncol(imGDone)){
    if (imGColor[i,j,1] > 0) {
      imGColor[i,j,1] = 0 * imGDone[i,j] # setting red to zero
      imGColor[i,j,3] = 0 * imGDone[i,j] # setting blue to zero
      imGColor[i,j,2] = 1 * imGDone[i,j] # setting green
    }
  }
}

imageShow(imGColor)

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

1 Ответ

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

Это на самом деле не проблема 'SuperpixelImageSegmentation' или 'OpenImageR'. Функция 'imageShow' пакета 'OpenImageR' использует под капотом функцию grid :: grid.raster . Полученная ошибка связана с тем, что измененные значения R, G, B не находятся в диапазоне от 0 до 1, как упоминалось также в другой проблеме stackoverflow . Чтобы преодолеть эту проблему, вы должны сначала нормализовать значения пикселей до [0,1], а затем внести свои коррективы. «Путь» к указанному вами файлу не существует в пакете «OpenImageR», поэтому я использовал другое доступное изображение пакета,

    library(SuperpixelImageSegmentation)
    library(OpenImageR)

    path = system.file("tmp_images", "2.jpg", package = "OpenImageR")

    image = readImage(path)
    init = Image_Segmentation$new()

    segmentation = init$spixel_segmentation(input_image = image,
                                            superpixel = 2000, # k
                                            AP_data = TRUE,
                                            use_median = TRUE,
                                            sim_wA = 5,
                                            sim_wB = 5,
                                            sim_color_radius = 3,
                                            kmeans_method = "kmeans",
                                            kmeans_initializer = "kmeans++",
                                            kmeans_num_init = 5,
                                            kmeans_max_iters = 50,
                                            verbose = TRUE)
    #getting the green part alone
    imG = segmentation$AP_image_data
    imG = imG[,,2]

    imB = segmentation$AP_image_data
    imB = imB[,,3]

    imR = segmentation$AP_image_data
    imR = imR[,,1]


    imR4 = imR / 2
    imB4 = imB / 2
    imGDone = imG - imR4
    imGDone = imGDone - imB4
    imageShow(imGDone)  # works fine, the result is a mask that contains only the green concentrated areas

    # the 'imGDone' array has values in the range [-0.08039, -0.03824] 
    summary(as.vector(imGDone))

    # you have to normalize first to [0,1] to avoid the error
    imGDone <- OpenImageR::NormalizeObject(imGDone)

    # values now in the range [0.0000, 1.0000]
    summary(as.vector(imGDone))

    imGColor <- segmentation$AP_image_data

    for (i in 1:nrow(imGDone)) {
      for (j in 1:ncol(imGDone)){
        if (imGColor[i,j,1] > 0) {
          imGColor[i,j,1] = 0 * imGDone[i,j] # setting red to zero
          imGColor[i,j,3] = 0 * imGDone[i,j] # setting blue to zero
          imGColor[i,j,2] = 1 * imGDone[i,j] # setting green
        }
      }
    }

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