0

大きなファイル 9600x7000 ピクセルの jpg ファイルがあり、エッジ検出を実行できるかどうかを確認しようとしています。次を使用して大きな(25Mb)ファイルをロードしようとしました:

from PIL import Image
image = Image.open("C:\\pathtofile\\test-tac.jpg")
image.show()

ただし、python インタープリターはクラッシュします。Python 2.7 を実行している Pycharm を使用しています。

そのため、GDAL (大きなGEO 参照ファイルに使用) を使用してファイルをロードしました。問題なくファイルをメモリにロードします。

#reference http://www.gdal.org/gdal_tutorial.html
import gdal
from gdalconst import *

dataset = gdal.Open("C:\\pathtofile\\test-tac.jpg", GA_ReadOnly )
if dataset is None:
   print "error loading file in gdal"

これにより、ファイルがロードされます。ただし、次のエッジ検出を実行しようとしています:

from matplotlib import pyplot as plt

from skimage import data
from skimage.feature import corner_harris, corner_subpix, corner_peaks
from skimage.transform import warp, AffineTransform
from skimage.draw import ellipse

# running corner Harris on the image object to detect image corners. 
#(reference http://scikit-image.org/docs/dev/auto_examples/plot_corner.html)
coords = corner_peaks(corner_harris(image), min_distance=3) #5
coords_subpix = corner_subpix(image, coords, window_size=13)

plt.gray()
plt.imshow(image, interpolation='nearest')
plt.plot(coords[:, 1], coords[:, 0], '.b', markersize=9)  # dots
plt.plot(coords_subpix[:, 1], coords_subpix[:, 0], '+r', markersize=15) # +
plt.plot(coords_subpix[:, 1][1], coords_subpix[:, 0][1], '*r', markersize=20)  #X_Point1=Subpix[:,1][1], Y_Point1=Subpix[:,0][1]

N=len(coords_subpix[:,0])
labels = ['point{0}'.format(i) for i in range(N)]

#Label corners in image
for label, x, y in zip(labels, coords_subpix[:,1], coords_subpix[:,0]):
   plt.annotate(label,
    xy=(x,y), xytext = (-10,10),
    textcoords = 'offset points', ha = 'right', va = 'bottom',
    bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
    arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))

   plt.axis((0, 9672, 7272, 0))            # (Y_start, Y_Stop, X_Stop, X_Start) ((0, 9672, 7272, 0))
   plt.show()

次のコードを使用して画像を生成すると、これは機能します。

 tform = AffineTransform(scale=(1.3, 1.1), rotation=1, shear=0.8,
                    translation=(210, 50))
 image = warp(data.checkerboard(), tform.inverse, output_shape=(350, 350))
 rr, cc = ellipse(310, 175, 10, 100)
 image[rr, cc] = 1
 image[180:230, 10:60] = 1
 image[230:280, 60:110] = 1

私の問題は、「画像」変数とGDALによって生成されたデータセット変数のデータ形式についてPythonをあまり理解していないことです。私の最終目標は、Python scikit-image ライブラリを使用して、大きな (10000x7000) ピクセルの jpg 画像でエッジ検出を実行できるようにすることです。GDALが大きなjpg画像を読み取るためのより良い方法があれば、私はそれを受け入れます。

私が設定した場合:

image=dataset

実行すると、次のエラーが表示されます。

coords = corner_peaks(corner_harris(image), min_distance=3) #5
 File "C:\Python27\lib\site-packages\skimage\feature\corner.py", line 171, in corner_harris
 Axx, Axy, Ayy = _compute_auto_correlation(image, sigma)
 File "C:\Python27\lib\site-packages\skimage\feature\corner.py", line 54, in _compute_auto_correlation
 if image.ndim == 3:
 AttributeError: 'Dataset' object has no attribute 'ndim'

このエラー メッセージは、データセット変数と画像変数の間のデータ型を理解していないことを示しています。

type(dataset)

与えます:

<class 'osgeo.gdal.Dataset'>

タイプ(画像)

与えます:

(350,350) float64.

大きなソース ファイルの場合は 、 http ://www.lib.utexas.edu/maps/tpc/txu-pclmaps-oclc-22834566_a-2c.jpg を使用して試してみてください。

4

2 に答える 2

2

すべての scikit-image アルゴリズムには、入力として Numpy 配列が必要です。したがって、データセット変数を ndarray に変換する必要があります。これを行う最も簡単な方法は、gdal プラグインを使用してファイルを読み取ることです (または、プラグインのソースを見てください。変換の方法が示されています)。

于 2013-12-21T00:22:25.890 に答える
0
import cv2
image = cv2.imread('txu-pclmaps-oclc-22834566_a-2c.jpg')

opencv は問題なくイメージをロードできます。画像の読み込みは問題ではなかったと思いますが。アルゴリズムの最初のステップは、約 6 ギガのメモリ使用量を調べることでした。したがって、Python の 64 ビット バージョンを使用していない場合、クラッシュします。また、コードに何か問題があるようです。実行しようとすると、2番目の関数で失敗しました。

ValueError: operands could not be broadcast together with shapes (0,13) (13,13)

これは (8003, 10859, 3) 画像でした。同じエラーメッセージが表示されたチャネルを 1 つだけ試してみました。

于 2013-12-20T22:54:32.037 に答える