1

John Zelle の「Python Programming: An Introduction to Computer Science」で演習をしようとしています。彼の本用に特別なグラフィック パッケージをダウンロードしました (リンク先の Web サイトにあるgraphics.py )。質問は次のように書かれています。

カラー画像をグレースケールに変換するプログラムを書きなさい。ユーザーが GIF または PPM 画像を含むファイルの名前を指定すると、プログラムは画像をロードしてファイルを表示します。マウスをクリックすると、プログラムは画像をグレースケールに変換します。ユーザーは、グレースケール イメージを保存するファイル名の入力を求められます。

グラフィックス ライブラリ (セクション 4.8.4) の Image オブジェクトに戻って確認することをお勧めします。画像を変換するための基本的な考え方は、画像をピクセルごとに処理し、それぞれを色から適切なグレーの色合いに変換することです。赤、緑、青の成分が同じ明るさになるように設定して作成された灰色のピクセル。つまり、color_rgb(0, 0, 0)黒、color_rgb(255, 255, 255)白、およびcolor_rgb(127, 127, 127)その中間のグレーです。グレーの明るさを決定するには、元の RGB 値の加重平均を使用する必要があります。グレースケール アルゴリズムの擬似コードは次のとおりです [何らかの理由で 4 スペースのインデントがプレビューで機能していません]。

for each row in the image:  
    for each column in the image:  
        r, g, b = get pixel information for current row and column  
        brightness = int(round(0.299r + 0.587g + 0.114b))  
    update the image # to see progress row by row

注:Imageクラスのピクセル操作はかなり遅いため、プログラムをテストするには比較的小さな画像 ( 12 メガピクセルではない) を使用することをお勧めします。


私はこれに何時間も取り組んできました。これは私のコードの最新バージョンです:

# grayscale.py

from graphics import *

def main():  
    infileName = input("File name: ")  
    outfileName = input("Save to: ")

    image = Image(Point(100,100), infileName)
    width = image.getWidth()
    height = image.getHeight()
    win = GraphWin("rgb")
    image.draw(win)

    row = 0
    column = 0

    win.getMouse()

    for row in range(200):
        for column in range(200):
            r, g, b = image.getPixel(row, column)
            brightness = int(round(0.299 * r + 0.587 * g + 0.114 * b))
            image.setPixel(row, column, color_rgb(brightness, brightness, brightness))
            win.update()

    win.getMouse()
    win.close()

main()

私はついにそれを手に入れたので、Pythonはエラーメッセージを出していません。しかし、プログラムが行うのは、画像をロードし、マウスを数回クリックしてから閉じることだけです。入力ファイルを U:\My Pictures\yay.gif、出力ファイルを U:\My Pictures\yay2.gif として入力しています。しかし、コンピュータを検索したところ、U:\My Pictures\yay2.gif は存在しません。私は何を間違っていますか?ちなみに、これはクラスのためのものではありません。私が尋ねるインストラクターはいません。

代わりに投稿でフォローアップする必要があるかもしれません。保存機能を追加しましたが、200x200 グレースケールのボックスとそれ以外がカラーの画像が得られました。だから、ここに私が変更したいくつかの行があります:

win = GraphWin("rgb", width, height)
for row in range(height):
    for column in range(width):

次のエラー メッセージが表示されます: Traceback (most recent call last):
File "C:\Python31\grayscale.py", line 31, in
main()
File "C:\Python31\grayscale.py", line 22,メイン
r、g、b = image.getPixel(行、列)
ファイル "C:\Python31\lib\graphics.py"、810 行目、getPixel
値 = self.img.get(x,y)
ファイル "C :\Python31\lib\tkinter_ init _.py"、3301 行目、get
return self.tk.call(self.name, 'get', x, y)
_tkinter.TclError: pyimage1 get: 範囲外の座標

おそらく画像のアンカーポイントを中央に変更する必要があることを理解しています。しかし、それは画像の幅と高さによってのみ判断できます。これらの値を取得するには、最初に画像をアップロードする必要があります。回避策はありますか?

4

4 に答える 4

3

画像を保存していません。変数 outfileName は使用されないことに注意してください。ある種の保存機能に渡す必要があります。graphics.py をざっと見てみると、これが必要だと思います。

編集

1 つのコーナーのみを変換するという問題を解決するには、代わりにこれを実行します。古いコードは最初の 200x200 ピクセルのみを変換していました。また、範囲を xrange に変更しました。これは必須ではありませんが、より効率的です。

for row in xrange(height):
        for column in xrange(windth):
于 2010-09-28T17:12:31.253 に答える
0

設定後の使用は見られません。つまり、結果をそのファイル(または他のファイル)に保存outfileNameすることは決してないようです。

于 2010-09-28T17:13:10.497 に答える