Как Spark читает мое изображение, используя формат изображения? - PullRequest
0 голосов
/ 29 октября 2019

Это может быть глупый вопрос, но я не могу понять, как Спарк прочитал мое изображение, используя аргумент spark.read.format("image").load(....).

После импорта моего изображения, которое дает мне следующее:

>>> image_df.select("image.height","image.width","image.nChannels", "image.mode", "image.data").show()
+------+-----+---------+----+--------------------+
|height|width|nChannels|mode|                data|
+------+-----+---------+----+--------------------+
|   430|  470|        3|  16|[4D 55 4E 4C 54 4...|
+------+-----+---------+----+--------------------+

Я прихожу к выводу, что:

  • мое изображение 430x470 пикселей,
  • мое изображение является цветным (RGB из-за nChannels = 3), которое является openCV-совместимым типом,
  • мой режим изображения равен 16, что соответствует определенному порядку байтов openCV.
    • Кто-нибудь знает, какой веб-сайт / документацию я мог бы просмотреть, чтобы узнать о нем больше?
  • данные в столбце данных имеют тип Binary, но:
    • когда я запускаю image_df.select("image.data").take(1) я получаю вывод, который выглядит как один массив (см. Ниже).
>>> image_df.select("image.data").take(1)

# **1/** Here are the last elements of the result
....<<One Eternity Later>>....x92\x89\x8a\x8d\x84\x86\x89\x80\x84\x87~'))]

# 2/ I got also several part of the result which looks like:
.....\x89\x80\x80\x83z|\x7fvz}tpsjqtkrulsvmsvmsvmrulrulrulqtkpsjnqhnqhmpgmpgmpgnqhnqhn
qhnqhnqhnqhnqhnqhmpgmpgmpgmpgmpgmpgmpgmpgnqhnqhnqhnqhnqhnqhnqhnqhknejmdilcilchkbh
kbilcilckneloflofmpgnqhorioripsjsvmsvmtwnvypx{ry|sz}t{~ux{ry|sy|sy|sy|sz}tz}tz}tz}
ty|sy|sy|sy|sz}t{~u|\x7fv|\x7fv}.....

То, что будет дальше, связано срезультаты отображаются выше. Это может быть связано с моим отсутствием знаний о openCV (или еще). Тем не менее:

  • 1 / Я не понимаю того факта, что если я получил изображение RGB, у меня должно быть 3 матрицы, но вывод заканчивается на .......\x84\x87~'))]. Я больше думал о получении чего-то вроде [(...),(...),(...\x87~')].
  • 2 / Имеет ли эта часть особое значение? Например, это разделитель между каждой матрицей или чем-то еще?

Чтобы быть более ясным в том, чего я пытаюсь достичь, я хочу обработать изображения для сравнения пикселей между каждым изображением. Поэтому я хочу знать значения пикселей для данной позиции в моем изображении (я предполагаю, что если у меня будет изображение RGB, у меня будет 3 значения пикселей для данной позиции).

Пример: допустим, у меня есть веб-камера, указывающая на небо только днем, и я хочу узнать значения пикселя в положении, соответствующем верхней левой части неба, я обнаружил, что конкатенацияиз этих значений дает цвет голубой , который говорит, что фотография была сделана в солнечный день. Допустим, единственная возможность состоит в том, что солнечный день принимает цвет Light Blue.
Далее я хочу сравнить предыдущую конкатенацию с другим конкататом значений пикселей в той же самой позиции, но из снимка, сделанного на следующий день. Если я узнаю, что они не равны, то я заключаю, что данная фотография была сделана в облачный / дождливый день. Если равен, то солнечный день.

Любая помощь по этому вопросу будет принята с благодарностью. Я вульгаризовал свой пример для лучшего понимания, но моя цель почти такая же. Я знаю, что модель ML может существовать для достижения этих целей, но я был бы счастлив попробовать это в первую очередь. Моя первая цель - разбить этот столбец на 3 столбца, соответствующих каждому цветовому коду: красная матрица, зеленая матрица, синяя матрица

1 Ответ

0 голосов
/ 30 октября 2019

Я думаю, у меня есть логика. Я использовал функцию keras.preprocessing.image.img_to_array (), чтобы понять, как классифицируются значения (так как у меня есть изображение RGB, у меня должно быть 3 матрицы: по одной на каждый цвет RGB). Сообщая, что если кому-то интересно, как это работает, я могу ошибаться, но я думаю, что у меня что-то есть:

from keras.preprocessing import image
import numpy as np
from PIL import Image

# Using spark built-in data source
first_img = spark.read.format("image").schema(imageSchema).load(".....")
raw = first_img.select("image.data").take(1)[0][0]
np.shape(raw)
(606300,) # which is 470*430*3



# Using keras function
img = image.load_img(".../path/to/img")
yy = image.img_to_array(img)
>>> np.shape(yy)
(430, 470, 3) # the form is good but I have a problem of order since:

>>> raw[0], raw[1], raw[2]
(77, 85, 78)
>>> yy[0][0]
array([78., 85., 77.], dtype=float32)

# Therefore I used the numpy reshape function directly on raw 
# to have 470 matrix of 3 lines and 470 columns:

array = np.reshape(raw, (430,470,3))
xx = image.img_to_array(array)     # OPTIONAL and not used here

>>> array[0][0] == (raw[0],raw[1],raw[2])
array([ True,  True,  True])

>>> array[0][1] == (raw[3],raw[4],raw[5])
array([ True,  True,  True])

>>> array[0][2] == (raw[6],raw[7],raw[8])
array([ True,  True,  True])

>>> array[0][3] == (raw[9],raw[10],raw[11])
array([ True,  True,  True])

Так что, если я правильно понял, спарк будет читать изображение как большой массив - (606300,) здесь- где на самом деле каждый элемент упорядочен и соответствует их соответствующему цветовому оттенку (RGB).
После моих небольших преобразований я получаю матрицу 430 из 3 столбцов x 470 строк. Поскольку мое изображение (470x430) для (WidthxHeight), каждая матрица соответствует позиции высоты пикселя и внутри каждого: 3 столбца для каждого цвета и 470 строк для каждой позиции ширины.

Надеюсь, это кому-нибудь поможет :)!

...