Как мне пройти через каждый 4-й пиксель в каждой 4-й строке, используя Python? - PullRequest
0 голосов
/ 04 марта 2010

Напишите функцию под названием listenToPicture, которая принимает одно изображение в качестве аргумента. Сначала показывает картинку. Далее он будет проходить через каждый 4-й пиксель в каждой 4-й строке и выполнять следующие действия. Он вычислит общее количество красного, зеленого и синего уровней пикселя, разделит его на 9, затем прибавит результат к 24. Это число будет номером ноты, сыгранной playNote. Это означает, что чем темнее пиксель, тем ниже нота; Чем светлее пиксель, тем выше нота. Эта нота будет воспроизводиться на полной громкости (127) в течение одной десятой секунды (100 миллисекунд). Каждый раз, когда он перемещается в новую строку, он печатает номер строки (значение y) на консоли. Ваша основная функция попросит пользователя выбрать файл с картинкой. Будет напечатано количество проигрываемых нот (количество пикселей на картинке, деленное на 16; почему?). Затем он вызовет функцию listenToPicture.

Вот что у меня есть, и я не уверен, как настроить циклический просмотр каждого 4-го пикселя в каждой 4-й строке. Любая помощь будет очень признателен.

def main():
    pic= makePicture( pickAFile())
    printNow (getPixels(pic)/16)
    listenToPicture(pic)

def listenToPicture(pic):
    show(pic)
    w=getWidth(pic)
    h=getHeight(pic)

    for px in getPixels(pic):        
        r= getRed(px)
        g= getGreen(px)
        b= getBlue(px)
        tot= (r+g+b)/9
        playNote= tot + 24

Ответы [ 4 ]

3 голосов
/ 04 марта 2010

Ступенчатые диапазоны приходят на ум range(0, len(), 4) но я не знаю тип вашего pic.

1 голос
/ 04 марта 2010

Возможно, вы захотите посмотреть на этот вопрос . Человек, который задал этот вопрос, похоже, работает над тем же проектом, что и вы.

1 голос
/ 04 марта 2010

Вот некоторые строительные блоки, на которых вы можете основать свою программу:

#!/usr/bin/env python
import easygui
import Image
import numpy

filename = easygui.fileopenbox() # pick a file
im = Image.open(filename) # make picture
image_width, image_height = im.size
im.show() # show picture
ar = numpy.asarray(im) # get all pixels
N = 4
pixels = ar[::N,::4]  # every 4th pixel in every N-th row
notes = pixels.sum(axis=2) / 9 + 24 # compute notes [0, 52]
print "number of notes to play:", notes.size

Ноты могут соответствовать разным тонам. Я использую здесь равную темперированную шкалу :

# play the notes
import audiere
import time

d = audiere.open_device()
# Notes in equal tempered scale 
f0, a = 440, 2**(1/12.)
tones = [d.create_tone(f0*a**n) for n in range(-26, 27)] # 53

for y, row in enumerate(notes):
    print N*y # print original row number
    for t in (tones[note] for note in row):
        t.volume = 1.0 # maximum volume
        t.play()
        time.sleep(0.1) # wait around 100 milliseconds
        t.stop()
0 голосов
/ 04 марта 2010

Я думаю, что лучший способ - это рассчитать смещение 4 строк и, когда в конце строки, добавить его в текущую позицию. Таким образом, вы получаете две итерации: одну в строке, которая пропускает 3 пикселя, и одну в конце каждой строки, пропускающую 3 строки. Но, как заметила msw, без какой-либо информации о вашем изображении мы больше не можем помочь.

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