안드로이드에서 사용하는 이미지는 해상도에 따라 다르게 적용하는데 최초에 파일을 저장하려면 drawable v24 폴더만 존재하기 때문에 고해상도용 이미지를 저장할 폴더는 신규로 생성해야 합니다.  생성 방법은 몇번의 마우스 클릭만으로 가능 합니다.

 

res에 마우스 포인터를 위치하고 우클릭을 해줍니다. 

New > Android Resource Directory

 

 

그리고 팝업 메뉴에서 Android Resource Directory를 선택 합니다.

그러면 팝업 창이 나오는데 여러 리소스들을 추가할 수 있지만 여기서는 이미지 관련 작업을 하기위한 선택을 합니다.

 

Resource type을 drawable로 선택하면 Directory Name은 자동으로 변경됩니다.

그리고 좌측 하단에서 Density를 클릭하고 중앙에 있는 [>>] 버튼을 클릭하면 아래와 같이 우측에 Density라는 타이틀이 생성되면서 select 박스가 나오는데 확장해 보면 해상도별 생성 가능한 폴더 목록이 표시됩니다.

 

 

select option 중 원하는 해상도 폴더를 선택하고 [OK] 버튼을 클릭해 줍니다.  눈에 보이지는 않지만 drawable 폴더에 새로운 폴더가 생성이 되었습니다.

 

확인을 하러면 drawable에 파일을 복사해보는 수 밖에 없는데 파일을 하나 추가 하면

 

처음에 없던 새로 생성한 폴더가 선택할 수 있는 목록에 추가되어 나타납니다.

다른 해상도 폴더도 동일하게 생성해서 사용하면 됩니다.

 

- copy coding -


내가 직접 찍지 않은 이미지를 인터넷에서 사용하다가 무단 사용에 의해 문제가 되지 않으려면 조금 귀찮아도 검색 조건을 조금만 설정 하면 마음대로 사용이 가능 합니다.

 

크롬에서 키워드를 사용해서 검색을 합니다.


chrome free image search


검색 결과에서 이미지를 선택 해 줍니다.


chrome free image search


검색 후 입력 창 우측에 설정이 있는데 이걸 클릭 하고 고급검색을 선택 합니다하단 이미지는 도구를 선택한 것 같은데 설정을 선택한 것 입니다.


chrome free image search


고급 검색 페이지로 이동을 하면 하단에 사용 권한 항목이 있습니다여기서 선택 박스를 클릭 하면 조건들이 나오는데 자신이 사용하고자 하는 용도를 선택 하고


chrome free image search


chrome free image search


고급검색 버튼을 클릭 하면 원하는 이미지를 다운받아 사용 할 수 있습니다.


chrome free image search


5. 임계처리 (이진화)

 

임계처리는 한 픽셀에 대해 임계 값을 정해 놓고 판별을 진행 하기 때문에 사용 하려면 일단 이미지가 컬러라면 gray로 변경시켜야 합니다.  gray로 변경되면 하나의 픽셀이 0에서 255까지의 값 중 하나를 갖게 되고 그 값이 설정한 임계 값을 넘는가 넘지 않는가에 따라 작업을 진행 합니다.

 

5.1 Global Threshold

 

Global Threshold0에서 255의 값을 2개의 영역으로 분할 하여 작업을 하기 때문에 너무 극단적인 결과가 나타날 수 있습니다.


cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst


parameter

내용

src

이미지 파일. single-channel (gray 이미지)

thresh

임계 값

maxval

임계 값 이상인 경우 적용할 값.  임계

type

cv2.THRESH_BINARY

cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC

cv2.THRESH_TOZERO

cv2.THRESH_TOZERO_INV

dst

결과 이미지

 

threshold() 함수는 픽셀 값이 thresh 값을 기준으로 큰가 작은가에 따라 픽셀의 값을 수정해서 보여주는 기능을 합니다.

아래 표를 보면 type에 따라 픽셀(x, y) 값이 thresh 보다 크면 maxval로 치환 하거나 0으로 치환 하거나 thresh로 치환 하거나 원래 값을 유지 하거나 하고 아니면 표에 있는 데로 값을 수정하게 됩니다.


type

src(x, y) > thresh

otherwise

cv2.THRESH_BINARY

maxval

0

cv2.THRESH_BINARY_INV

0

maxval

cv2.THRESH_TRUNC

thresh

src(x, y)

cv2.THRESH_TOZERO

src(x, y)

0

cv2.THRESH_TOZERO_INV

0

src(x, y)


- 원본 이미지

opencv_threshold


import numpy as np

import cv2

 

imgFile1 = 'C:/opencv/threshold01.png'

 

img1 = cv2.imread(imgFile1, cv2.IMREAD_GRAYSCALE)

 

ret1, addWeight1 = cv2.threshold(img1, 127, 255, cv2.THRESH_BINARY)

ret2, addWeight2 = cv2.threshold(img1, 127, 255, cv2.THRESH_BINARY_INV)

ret3, addWeight3 = cv2.threshold(img1, 127, 255, cv2.THRESH_TRUNC)

ret4, addWeight4 = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO)

ret5, addWeight5 = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO_INV)

 

cv2.imshow('THRESH_BINARY', addWeight1)

cv2.imshow('THRESH_BINARY_INV', addWeight2)

cv2.imshow('THRESH_TRUNC', addWeight3)

cv2.imshow('THRESH_TOZERO', addWeight4)

cv2.imshow('THRESH_TOZERO_INV', addWeight5)

   

cv2.waitKey(0)

cv2.destroyAllWindows()


- 상단 원본과 결과 모음 입니다.

하나의 값에 의하여 양분되는걸 볼 수 있습니다.


opencv_threshold



다른 예로 global threshold를 이미지에 사용해 보겠습니다.

하나의 하트를 배경이 다른 두 곳에서 사진을 찍고 THRESH_BINARY를 적용해 보았습니다.

 

- 장판 위 하트


opencv_threshold


- 회색 바탕 하트


opencv_threshold


thresh82로 하니 장판에 있는 하트는 윤곽선을 확인할 수 있지만 회색에 있는 하트는 이제 뭔가 보이려고 합니다.


- 장판 위 하트


opencv_threshold


- 회색 바탕 하트


opencv_threshold



이제 thresh 값이 180이 되었습니다장판에 있는 하트는 윤곽선을 찾으려면 좀 어려울 것 같은데 회색에 있던 하트는 선명하게 윤곽선을 구할 수 있습니다.


- 장판 위 하트


opencv_threshold


- 회색 바탕 하트


opencv_threshold


이처럼 물체의 경계가 어느 정도의 기준 값으로 확실히 구분이 되는 경우에 사용하면 그 물체만 뽑아 내는데 사용할 수 있습니다.

 

 

5.2 Adaptive Threshold

 

Global Threshold는 물체가 주위와 구분이 되는 경우에 사용이 가능하지만 경계가 애매한 경우에는 사용하기가 어렵습니다그래서 이미지를 작은 단위로 나누어 비교하는 방식으로 adaptiveThreshold를 사용면 좀더 세밀한 값을 도출 할 수 있습니다


cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst


parameter

내용

src

이미지 파일. single-channel (gray 이미지)

maxValue

임계 값 이상인 경우 적용할 값.  임계

adaptiveMethod

적용할 thresholding algorithm

ADAPTIVE_THRESH_MEAN_C

ADAPTIVE_THRESH_GAUSSIAN_C

thresholdType

cv2.THRESH_BINARY

cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC

cv2.THRESH_TOZERO

cv2.THRESH_TOZERO_INV

blockSize

threshold 계산을 위한 주변 pixel size

C

평균 또는 가중 평균에서 차감할 값.

dst

결과 이미지

 

 

알고리즘

src(x, yO > T(x, y)

otherwise

ADAPTIVE_THRESH_MEAN_C

maxValue

0

ADAPTIVE_THRESH_GAUSSIAN_C

0

maxValue

 

어느덧 짐을 싸야 하는 시간이 되었군요. 잠시 예전 계약서를 보면서


opencv_threshold


- cv2.ADAPTIVE_THRESH_GAUSSIAN_C


opencv_threshold


- cv2.ADAPTIVE_THRESH_MEAN_C


opencv_threshold


이렇게 상황에 적합한 함수를 사용하면 됩니다.



4. 이미지 연산

 

4.1 이미지 더하기


4.1.1 modulo 연산


img = img1 + img2

두개의 이미지를 각각의 픽셀 단위로 덧셈을 하여 255보다 큰 경우 256으로 나눈 나머지를 픽셀 값으로 설정 합니다. ( 250 + 7 = 257/256 -> 1)

더하는 이미지는 사이즈가 동일해야 하며 사이즈가 같지 않으면 아래와 같은 오류가 발생 합니다.


 ValueError: operands could not be broadcast together with shapes (277,350,3) (213,350,3) 


4.1.2 Saturation 연산


cv2.add() 함수를 이용하여 두개의 이미지를 각각의 픽셀 단위로 덧셈을 한 후 255보다 큰 경우 255를 픽셀 값으로 설정 합니다. (250 + 7 = 257 -> 255)

 

cv2.add(src1, src2[, dst[, mask[, dtype]]]) → dst

 

parameter

내용

src1

이미지 파일

src2

이미지 파일

dst

결과 파일

mask

영역 지정

dtype

output depth

 

이미지를 더하는 예제


import numpy as np

import cv2

 

img1 = 'F:/Python/images/image001.png'

img2 = 'F:/Python/images/image002.png'

 

# image read

imread1 = cv2.imread(img1, cv2.IMREAD_COLOR)

imread2 = cv2.imread(img2, cv2.IMREAD_COLOR)

 

# image add

img_plus = imread1 + imread2

img_add = cv2.add(imread1, imread2)

 

# image show

cv2.imshow('image + ', img_plus)

cv2.imshow('image add', img_add)

 

cv2.waitKey(0)

cv2.destroyAllWindows()



두개의 이미지를 이용하여 연산을 진행 합니다.


image001.png

opencv_bit_add


image002.png

opencv_bit_add


- modulo 연산


메뚜기 사진의 배경이 거의 없어서 배경을 제외 하고는 물체 확인이 어렵습니다.


opencv_bit_add


- Saturation 연산


이것도 원본 사진을 보지 않은 경우에는 예측이 어렵습니다.


opencv_bit_add


4.3 이미지 Blending

 

cv2.addWeighted()

두개의 이미지에 각각의 가중치를 조절하여 덧셈하는 방법입니다가중치의 값이 큰 이미지가 좀더 선명하게 나타 납니다.

 

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst


parameter

내용

src1

이미지1

alpha

이미지1 가중치

src2

이미지2

beta

이미지2 가중치

gamma

각 덧셈에 추가하는 값

dst

결과 이미지

dtype

depth

 

dst[i] = saturate(src1[i]*alpha + src2[i]*beta + gamma)


import numpy as np

import cv2

 

img1 = 'F:/Python/images/image001.png'

img2 = 'F:/Python/images/image002.png'

 

# image read

imread1 = cv2.imread(img1, cv2.IMREAD_COLOR)

imread2 = cv2.imread(img2, cv2.IMREAD_COLOR)

 

def weight (x):

    pass

 

cv2.namedWindow('image')

cv2.createTrackbar('Weight', 'image', 0, 100, weight)

 

while True:

    weight = cv2.getTrackbarPos('Weight','image')

    addWeight = cv2.addWeighted(imread1,float(100-weight) * 0.01, imread2,float(weight) * 0.01,0)

    cv2.imshow('image', addWeight)

 

    if cv2.waitKey(1) &0xFF == 27:

        break;

 

cv2.waitKey(0)

cv2.destroyAllWindows()


가중치가 높은 이미지가 선명하게 보이게 됩니다우리가 흔하게 볼 수 있는 은은한 장면 전환과 같습니다.


opencv_bit_add




12

+ Recent posts