2016-08-07 12 views
0

画像を拡大しようとしています。python-numpyを使用して画像を拡大

import numpy as np 
from scipy.ndimage.interpolation import zoom 
import Image 
zoom_factor = 0.05 # 5% of the original image 
img = Image.open(filename) 
image_array = misc.fromimage(img) 
zoomed_img = clipped_zoom(image_array, zoom_factor) 
misc.imsave('output.png', zoomed_img) 

クリッピングズーム参考:
Scipy rotate and zoom an image without changing its dimensions

これがない作品や、このエラーをスローします:この 上 ValueError: could not broadcast input array from shape

任意のヘルプや提案を与えられた画像をズームする方法はありますズームファクタ。そして何が問題なの?

トレースバック:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1443, in _execute 
    result = method(*self.path_args, **self.path_kwargs) 
    File "title_apis_proxy.py", line 798, in get 
    image, msg = resize_image(image_local_file, aspect_ratio, image_url, scheme, radius, sigma) 
    File "title_apis_proxy.py", line 722, in resize_image 
    z = clipped_zoom(face, 0.5, order=0) 
    File "title_apis_proxy.py", line 745, in clipped_zoom 
    out[top:top+zh, left:left+zw] = zoom(img, zoom_factor, **kwargs) 
ValueError: could not broadcast input array from shape (963,1291,2) into shape (963,1291,3) 
+0

イメージの基本データ形式に問題があると考えられます。なぜ、[scipyの関数](http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.imread.html#scipy.ndimage.im)(PIL ;しかし、それはデータ構造に関するいくつかの前提を扱うほうが適していますか?) '' clipped_zoom'''とは何ですか?あなたはscipy 0.18.0に '' 'zoom''という関数を1つしか持たないズームをインポートしています。 – sascha

+1

私はこれを助けてくれましたhttp://stackoverflow.com/questions/37119071/scipy-rotate-and-zoom-animage-without-changing-its-dimensions これにはclipped_zoom関数が含まれています – Abhi

+1

これはそうですデバッグを容易にしません。本当にここで何か助けが必要な場合は、私たちにすべての情報を提供する必要があります。 '' clipped_zoom'''のこと、どうすればいいのですか?また...あなたはエラーの一部のみを投稿しています(これはおそらくあなたの動作を再現/ numpy-operationが壊れています - >コード内) – sascha

答えて

3

あなたは私のprevious answerから使用しているclipped_zoom機能は、シングルチャンネル画像のために書かれました。

現時点では、入力配列の「カラー」ディメンションおよび幅と高さのディメンションに同じズーム係数が適用されています。 ValueErrorは、out配列が入力と同じ数のチャネルに初期化されますが、zoomの結果はズーム係数のためにチャネルが少なくなるために発生します。

それはあなたがclipped_zoomに別々に各カラーチャンネルを渡し、結果を連結、またはあなたがscipy.ndimage.zoomからzoom_factor引数としてタプルではなく、スカラーを渡すことができる可能性がいずれかのマルチチャンネルの画像のために働くようにします。

後者のアプローチを使用して以前の回答を更新しました。これで、マルチチャンネル画像とモノクロの両方で機能するようになりました。

+0

それはうまく動作しますが、時には警告を表示します。serWarning:scipy 0.13.0から、zoom()の出力形状はint()ではなくround()で計算されます。かわった。 "返された配列が変更されました。"、UserWarning) '。私はこれを無視すべきでしょうか? – Abhi

+0

私のコードは 'np.round'を使って出力の大きさを計算するので、うまくいくはずです。ちなみに、scipy 0.13.0は3年前に出てきたので、更新を検討するかもしれません。 –

関連する問題