
[code]

    import cv2
    
    file="face_01.jpg"
    img=cv2.imread(file)
    imgray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    h,w=imgray.shape
    print(imgray[60][39])
    
[/code]

これを実行すると`IndexError: index 60 is out of bounds for axis 0 with size
40`とエラーが出ます。imgrayの座標[60][39]が白か黒かを調べたいのでこのような実行をしました。ちなみにh=40,w=67です。解決策を教えてほしいです。


CC BY-SA 4.0
2018-07-15T10:26:51.540
46631
2018-07-16T03:05:59.050
2018-07-15T11:04:30.100
19110
29322
question
python opencv
python opencv エラー　画像処理　index


[Accessing and Modifying pixel
values](https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#accessing-
and-modifying-pixel-values)によると、  
以下でpixel値を取得できるようです。

[code]

    px = img[100,100]
    
[/code]

環境がないため確認できませんが、  
以下で解決するかもしれません。

[code]

    import cv2
    
    file="face_01.jpg"
    img=cv2.imread(file)
    imgray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    h,w=imgray.shape
    print(imgray[39,60])
    
[/code]


CC BY-SA 4.0
2018-07-15T11:04:00.330
46633
2018-07-15T11:04:00.330
46631
answer


OpenCVでは、配列(ndarray)の添字の順番は(x,y(,c))ではなく、(y,x(,c))になっています。  
これは恐らく、メモリの連続性を考えた時に、普通画像はx方向にメモリを連続に確保するためにyが先になっています。  
ご質問のコードは添字のxとyが逆になっているために、画像の範囲外へのアクセスになり、エラーになっているので、添字の順番を変えて、

[code]

    print(imgray[39][60])
    
[/code]

とすればいいかと。

参考文献:  
<https://stackoverflow.com/questions/19098104/python-opencv2-cv2-wrapper-get-
image-size>  
numpyはC言語と同じ順番でメモリにデータが格納されているので、array[i,j]とした時には添字jについてメモリは連続になります（Fortranとかだと逆なので注意）  
<http://kaisk.hatenadiary.com/entry/2015/02/19/224531>


CC BY-SA 4.0
2018-07-16T02:54:36.293
46646
2018-07-16T03:05:59.050
2018-07-16T03:05:59.050
18595
18595
46631
answer