Как изменить каждый пиксель

Я новичок в Python, и я до сих пор не знаю, что именно возвращает пиксель Qimage (кажется, это тупель rgb или rgba - отсутствие объявления типа не помогает). Я хочу захватить каждый пиксель и изменить его.

newqim = QImage(imWidth, imHeight, QImage.Format_ARGB32)
for xstep in range(0, imWidth - 1):
    for ystep in range(0, imHeight - 1):

        pixelValueTuple = im.getpixel((xstep, ystep))
        pixelR = pixelValueTuple[0]
        pixelG = pixelValueTuple[1]
        pixelB = pixelValueTuple[2]
        copiedValue = qRgb(pixelR, pixelG, pixelB)

        newqim.setPixel(xstep, ystep, copiedValue)

Выше приведен код, я думал, что затем повторю этот newqim, но я не могу понять, как именно я буду делать это в Python.

for xstep in range(0, imWidth-1):
    for ystep in range(0, imHeight -1):

person recycledElectrons    schedule 24.04.2015    source источник
comment
из stackoverflow.com/q/18406149/566035 люди преобразуют его либо в массив numpy, либо в мат opencv. Но привязка opencv python (cv2) теперь очень хорошо работает с numpy, поэтому большинство людей будут использовать только numpy.   -  person otterb    schedule 25.04.2015


Ответы (1)


Я не уверен, что понял, чего вы хотите, но, поскольку вы новичок в Python, вот несколько советов...

Распаковка

Этот код:

pixelR = pixelR[0]
pixelG = pixelValueTuple[1]
pixelB = pixelValueTuple[2]

Такой же как:

pixelR, pixelG, pixelB = pixelValueTuple[:3]

Если вы уверены len(pixelValueTuple) == 3, то просто:

pixelR, pixelG, pixelB = pixelValueTuple

ПЭП-8

Немного придирки, но парни, работающие с питоном, как правило, немного наивны в синтаксисе. Пожалуйста, прочтите PEP-8. С этого момента я называю переменные в соответствии с ним (camelCase например, переменные просто режет мне глаза %-).

Диапазон

Вы, вероятно, хотите range(width) вместо range(0, width-1).

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(0, 10 - 1)
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Теперь вернемся к вашей проблеме.

width, height = 300, 300
im = QImage(width, height, QImage.Format_ARGB32)

for x in range(im.width()):
    for y in range(im.height()):
        r, g, b, a = QColor(im.pixel(x ,y)).getRgb()
        # ... do something to r, g, b, a ...
        im.setPixel(x, y, QColor(r, g, b, a).rgb())

Пример

width, height = 100, 100
im = QImage(width, height, QImage.Format_ARGB32)

for x in range(im.width()):
    for y in range(im.height()):
        im.setPixel(x, y, QColor(255, x * 2.56, y * 2.56, 255).rgb())

im.save('sample.png')

Результат:

результат

person Paulo Scardine    schedule 24.04.2015
comment
Спасибо, как я уже сказал, я понятия не имею о синтаксисе/семантике Python, поэтому я не уверен, что делает диапазон (0, ширина-1). Я предположил, что это была отправная точка для итерации, такой как цикл Java for. Я получил этот код в качестве отправной точки, мне нужно написать функции обработки изображений, такие как умножение, сложение, гамма и т. д. - person recycledElectrons; 25.04.2015
comment
Вероятно, вам нужно что-то вроде im = QImage(); im.load('sample.png'). Кстати, у класса QColor есть много полезных методов, проверьте документы. - person Paulo Scardine; 25.04.2015
comment
Спасибо, Пауло, вы очень помогли. Изображение действительно загружается дальше в коде, просто нужно лучше понять, как манипулировать каждым из них. - person recycledElectrons; 25.04.2015
comment
Добро пожаловать. Просто для ясности, вы считаете, что ответили на свой вопрос? Если да, вы можете сигнализировать об этом, щелкнув зеленую галочку слева, а если нет, как я могу улучшить свой ответ, чтобы он был принят? - person Paulo Scardine; 25.04.2015