How do I loop through every 4th pixel in every 4th row, using Python?
编写一个名为listentopicture的函数,该函数将一张图片作为参数。它首先显示图片。接下来,它将每四行中的每四个像素循环一次,并执行以下操作。它将计算像素的红色、绿色和蓝色级别的总和,除以9,然后将结果相加为24。该号码将是PlayNote播放的音符编号。这意味着像素越暗,音符就越低;像素越浅,音符就越高。它将以全音量(127)播放该音符十分之一秒(100毫秒)。每次移动到新行时,它都会在控制台上打印出行号(Y值)。您的主要功能将要求用户选择带有图片的文件。它将打印要播放的笔记数(图片中的像素数除以16;为什么?)然后调用listentopicture函数。
这是我到目前为止所拥有的,我不知道如何设置每4行中每4个像素的循环。任何帮助都将不胜感激。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
我想到的是阶梯式射程,但我不知道你的型号。
你可能想看看这个问题。问这个问题的人似乎和你在同一个项目上工作。
以下是一些可以作为程序基础的构建基块:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/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 |
音符可以对应不同的音调。这里我用的是等温标度:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 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() |
我想最好的方法是计算4行的偏移量,当行尾时,将其添加到当前位置。所以有两个迭代:一个在行中,跳过3个像素,另一个在每行的末尾,跳过3行。但是,正如MSW所指出的,如果没有关于您的图片对象的任何信息,我们无法提供更多帮助。