Как разбить отдельные пиксели из каждой строки на числа - PullRequest
0 голосов
/ 21 июня 2020

У меня есть текстовый файл, содержащий информацию как таковую:

RGB
768
768
08 87 68
118 101 83
110 92 72
114 96 76
115 97 77

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

gray = (red + green + blue) / 3

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

Я пишу его в новый текстовый файл в том же формате, только что преобразованный в оттенки серого, поэтому:

RGB
768
768
54 54 54
100 100 100
91 91 91
95 95 95
96 96 96
   with open('1.txt', 'r') as input_file:
    content_list = input_file.readlines()
    width = 768
    height = int(len(content_list) / width)

    listRGBs = [] 

    with open('fsanche4_1.txt', 'w') as out_file:
        i = 0
        j = 0

        print(f"{int(height)}")
        out_file.write(f"RGB\n")
        out_file.write(f"{height}\n")
        out_file.write(f"{width}\n")    
       
        for i in range(0, height, 1):
            #row = listRBGs[i]
            for row in listRGBS:

              for j in range(0, width, 1):
                blue = row[j]
                red = row[j + 1]
                green = row[j + 2]

                gray = (red + green + blue) / 3
                out_file.writelines(f"{gray} {gray} {gray}\n")

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

RGB
768
768

Вот новый код, который у меня есть:

with open('1.txt', 'r') as input_file:
    line = input_file.readlines()
    width = 768
    height = 768

    with open('fsanche4_1.txt', 'w') as out_file:
        i = 0
        j = 0
        print(f"{int(height)}")
        out_file.write(f"RGB\n")
        out_file.write(f"{height}\n")
        out_file.write(f"{width}\n")

        for line in input_file:
          blue, red, green = line.split()
          gray = (int(red) + int(green) + int(blue)) / 3
          out_file.write(f"{gray} {gray} {gray}\n")
        line = input_file.readlines()

1 Ответ

0 голосов
/ 21 июня 2020

Не совсем уверен, что у меня это право, но если вам нужно какое-то быстрое и простое (не самое элегантное решение):

with open('input.txt') as f, open('output', 'w') as o:

    line = f.readline()

    while line:
        try:
            blue, red, green = line.split()
        except ValueError as e:
            o.write(line)
            line = f.readline()
            continue
        grey = (int(blue) + int(red) + int(green)) / 3
        o.write(f'{int(grey)}\n')
        line = f.readline()

Его обработка:

RGB
768
768

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

Кроме того, просто подумав вслух, похоже, что вы пытаетесь сохранить 2-мерный массив ссылок RGB пикселей в только список, который может сбить с толку, если кто-то еще использовал ваш код, т.е. выполняет ли он каждый столбец или каждую строку последовательно? Может быть, поэтому вы используете двойное значение для l oop, чтобы назначить x и y, но вы не сохраняете эту ссылку как единственное, что пишете преобразование RBG -> Gray.

В любом случае, блок кода переключит первый файл, который у вас есть, на второй. Надеюсь, это поможет.

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