2016-12-15 4 views
1

Python에서 안전하지 않은 이미지 처리를 수행 할 수 있습니까?C#의 LockBits와 같은 Python의 안전하지 않은 이미지 처리

C#에서와 마찬가지로 Image에서 getPixel 메소드가 단순히 너무 느리게 실행되는 것처럼 Python에서 내 픽셀 처리로 단단한 벽이 발생했습니다.

C#에서는 LockBits와 같은 메모리에있는 이미지에 직접 액세스 할 수 있습니까? 그것은 내 프로그램이 훨씬 빨리 돌아 가게 할 것이다.

감사합니다,

마크

답변

2

"안전하지 않은"아무것도 이것에 대해이 없습니다.

파이썬이 어떻게 작동하는지 이해하면 각 픽셀의 정보를 검색하는 방법을 호출하는 것이 느려질 것이라는 특허가 있습니다.

우선, 아무 정보도주지 않더라도 Python을 사용하여 이미지 조작을 위해 가장 잘 알려진 라이브러리 인 Python Image Library (PIL)를 "베개"로 사용한다고 가정합니다. 제 3 자 패키지이므로 아무 것도 사용하지 않아도됩니다. (PIL 이미지에 getpixel 방법을 가지고 아니지만 getPixel 일)

조작 가능한 방법으로 모든 데이터를 가지고하는 한 가지 간단한 방법은 이미지 데이터의이 ByteArray 객체 만들 수는 - img 변수에 이미지 제공을 당신 할 수있다 :

data = bytearray(img.tobytes()) 

그리고 그것은 당신이 당신의 이미지의 모든 데이터에 선형으로 접근 할 수있다. 특정 픽셀을 얻으려면 이미지 너비, 높이 및 픽셀 당 바이트 수를 가져와야합니다. 나중에 나오는 것은 PIL의 직접 Image 속성이 아니므로 Image의 mode으로 계산해야합니다. 당신이 이미지에 "X, Y, 폭, 크기"에서 사각형을 작성하려는 경우 가장 일반적인 이미지 형식,

그래서 RGB, RGBA와 L., 당신은이 작업을 수행 할 수 있습니다

def rectangle(img, x,y, width, height): 
    data = bytearray(img.tobytes()) 
    blank_data = (255,) * witdh * bpp 
    bpp = 3 if data.mode == 'RGB' else 4 if data.mode == 'RGBA' else 1 
    stride = img.width * bpp 
    for i in range(y, y + height): 
     data[i * stride + x * bpp: i * stride + (x + width) * bpp)] = blank_data 
    return Image.frombytes(img.mode, (img.width, img.height), bytes(data)) 

그다지 사용되지는 않지만 간단하게 조작 할 수 있습니다. Python을 사용하여 이미지에 필터 및 기타 복잡한 알고리즘을 적용해야하는 사람들은 대개 numpy-python 고성능 데이터 조작 패키지를 사용하여 이미지에 액세스합니다.이 데이터 조작 도구는 이미지에 특정한 것들이 많은 패키지와 밀접하게 결합되어 있습니다. 일반적으로 scipy .

그래서, 이미 위의 모든 좌표 않는 ndarray 같은 이미지를 가지고 -> 당신을 위해 변환 바이트, 당신은 사용할 수 있습니다

import scipy.misc 
data = scipy.misc.imread(<filename>) 

+0

(https://docs.scipy.org/doc/scipy/reference/에서 문서를 확인하십시오) 이것은 기본에 관한 질문 일지 모르지만 나는 데이터 (i * stride + x * bpp : i * stride + (x + width) * bpp) 이전에 이런 종류의 표현을 만난 적이 없다. 이것은 사전인가? 나는 그것의 주위에 나의 머리를 감쌀 수 없다 –

+0

숫자 조각 색인을 사용하여 숫자를 가진 간단한 순서 - 표정은 심상 선에 직사각형의 첫번째 화소의 주소 (바이트에서) 계산이다 line (x, i)와 마지막 픽셀 ((x + width, i)에있는 픽셀). 파이썬 조각 인덱스처럼 보이지 않는다면, 더 잘 배우십시오. https://docs.python.org/3 /tutorial/introduction.html#lists – jsbueno

+0

아, 파이썬의 슬라이싱 연산자에 익숙하지 않았습니다. 이제 모든 것이 의미가 있습니다. 감사합니다! –

관련 문제