如何使用Python循环每第4行中的每第4个像素?

时间:2010-03-04 02:26:23

标签: python image audio

编写一个名为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 个答案:

答案 0 :(得分:3)

我想到了range(0, len(), 4),但我不知道pic的类型。

答案 1 :(得分:1)

以下是一些基于程序的构建块:

#!/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

注释可以对应不同的音调。我在这里使用equal tempered scale

# 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()

答案 2 :(得分:1)

您可能需要查看this question。提出这个问题的人似乎和你一样在同一个项目上工作。

答案 3 :(得分:0)

我猜最好的方法是计算4行的偏移量,并且当在行的末尾时,将其添加到当前位置。所以你需要进行两次迭代:一次在行内,一次跳过3个像素,一行在每行的末尾跳过3行。但是,正如msw所指出的那样,没有关于你的pic对象的任何信息,我们无能为力。