두개의 이미지를 옆에 또는 아래쪽에 붙이는 기능 입니다단순한 기능이라 자세한 설명은 필요가 없을 것 같고 주의 사항으로는 가로로 붙이는 경우 높이가 같아야 하고 세로로 붙이는 경우는 폭이 같아야 합니다.

 

1. concat

 

- 세로 붙이기


cv2.vconcat([img1, img2]) 함수를 이용하면 두개의 이미지를 세로로 붙여 리턴 합니다.

 

- 가로 붙이기


cv2.hconcat([img1, img2]) 함수를 이용하면 두개의 이미지를 가로로 붙여 리턴 합니다.



 #-*-coding:utf-8-*-

import cv2

import numpy as np

from matplotlib import pyplot as plt

 

imgFile1 = 'F:/Python/images/heart01.png'

imgFile2 = 'F:/Python/images/heart02.png'

 

# 이미지 읽기

img1 = cv2.imread(imgFile1, 1);

img2 = cv2.imread(imgFile2, 1);

 

# 사이즈 조절

img1 = cv2.resize(img1,(230,260))

img2 = cv2.resize(img2,(230,260))

 

# 이미지 붙이기

addv = cv2.vconcat([img1, img2])

addh = cv2.hconcat([img1, img2])

 

cv2.imshow('imgv',addv)

cv2.imshow('imgh',addh)

 

cv2.waitKey(0)

cv2.destroyAllWindows()



- cv2.vconcat([img1, img2])
결과 


opencv_hconcat_vconcat


- cv2.hconcat([img1, img2]) 결과


opencv_hconcat_vconcat



2. stack

 

- 세로 붙이기


cv2. vstack ([img1, img2]) 함수를 이용하면 두개의 이미지를 세로로 붙여 리턴 합니다.

 

- 가로 붙이기


cv2. hstack ([img1, img2]) 함수를 이용하면 두개의 이미지를 가로로 붙여 리턴 합니다.


#-*-coding:utf-8-*-

import cv2

import numpy as np

from matplotlib import pyplot as plt

 

imgFile1 = 'F:/Python/images/heart01.png'

imgFile2 = 'F:/Python/images/heart02.png'

 

# 이미지 읽기

img1 = cv2.imread(imgFile1, 1);

img2 = cv2.imread(imgFile2, 1);

 

# 이미지 사이즈 조절

img1 = cv2.resize(img1,(230,260))

img2 = cv2.resize(img2,(230,260))

 

# 이미지 붙이기

addv = np.vstack((img1, img2))

addh = np.hstack((img1, img2))

 

cv2.imshow('imgv',addv)

cv2.imshow('imgh',addh)

 

cv2.waitKey(0)

cv2.destroyAllWindows()


- np.vstack((img1, img2)) 결과


opencv_vstack_hstack


- np.hstack((img1, img2)) 결과


opencv_vstack_hstack


'Tensorflow > OpenCV' 카테고리의 다른 글

OpenCV threshold 설명  (0) 2020.11.23
OpenCV 6. 히스토그램 (Python)  (1) 2020.10.03
OpenCV 5. 임계처리 (이진화) (Python)  (0) 2019.04.07
OpenCV 4. 이미지 비트 연산 (Python)  (0) 2019.04.06
OpenCV 4. 이미지 연산 (Python)  (0) 2019.04.05


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


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



전쟁에서 폭탄을 맞는 꿈 해몽

  -> 어떤 기관이나 사람에게 부탁한 일이나 작품이 소망을 달성하거나 당선된다.


전쟁이나 싸움 등의 꿈에서 자신이 상대를 공격하는 꿈 해몽

  -> 현실적으로 공포나 불안을 감추거나 없애려는 것을 암시한다.


전쟁터에서 싸우다 부상을 당하는 꿈 해몽

  -> 재물이나 이권을 얻고 관공서나 공공기관과 관련된 일이 원만하게 해결되거나, 소망하는 목표를 이루게 된다.


전쟁터에서 적군의 총에 맞는 꿈 해몽

  -> 재물이나 이권을 얻으며 관공서나 공공기관과 연관된 일이 잘 되며, 소망하는 목표를 성취하게 된다.


전쟁터에서 적의 창이나 칼에 찔리는 꿈 해몽

  -> 재물과 이권을 얻거나 원하는 목표를 이루면서 여러 사람들의 추대 내지 존경을 받는다.


전쟁터에서 싸우다 사망하는 꿈 해몽

  -> 소망하는 목적의 성취 및 직장의 승진, 영전 또는 재물과 사업이 번창하는 발전을 한다.


전쟁터에서 적군의 무기와 군수품을 노획하는 꿈 해몽

  -> 뜻밖의 횡재수로 많은 재물과 돈이 들어오거나, 재수가 대통한 일이 있다.


전쟁터에서 적장의 머리를 보는 꿈 해몽

  -> 만사가 순리대로 진행되어 권세와 명예도 얻어 편안하게 될 것이다.


전쟁에서 승리하는 꿈 해몽

  -> 진행중인 일을 성공적으로 마무리지어서 주위의 부러움을 사게 될 징조이다.


전쟁 꿈 해몽



전쟁에서 승리를 거두어 기뻐하는 꿈 해몽

  -> 소망하는 목적이나 사업의 성취 및 지위나 신분이 높아지는 등 좋은 일이 있으며, 군인은 승진운이 있다.


전쟁에서 패하는 꿈 해몽

  -> 시행하는 일마다 생각대로 되지 않고 걱정거리만 쌓이는 운명이 된다.


전쟁터에 나가는 애인에게 매달리며 서럽게 울었던 꿈 해몽

  -> 애인과는 이별을 의미하는 것이며, 울었다면 이별로 인한 고통까지 정리할 마음의 준비가 되어있는 상태.


전쟁이 격렬해진 꿈 해몽

  -> 격렬해질수록 하는 일마다 복잡한 난관에 부딪히게 된다.


전쟁이 났다고 군대가 이동한 것을 본 꿈 해몽

  -> 자기가 계획한 일을 뜻대로 추진해 나간다.


전쟁이 나서 피난간 꿈 해몽

  -> 남에게 부탁한 일이나 집안 사정으로 일이 제대로 풀리지 않는다.


전쟁이 발발했는데 적병을 한 명도 죽이지 못하는 꿈 해몽

  -> 여러 계통에서 많은 일을 받아 모두 순조롭게 처리하는데, 한가지가 해결되지 않아 고통을 격게 된다.


인접한 국가 간에 전쟁이 발생하는 꿈 해몽

  -> 실제로 인접국 간에 전쟁, 자국과 타국간의 전쟁, 정당 간의 싸움, 지역 이기주의, 계층, 친구간의 다툼이 있다.


전쟁 또는 불이 나서 사람들이 비명을 지르는 꿈 해몽

  -> 본인과 관계되는 어떤 일이 크게 성취되어 많은 사람들이 감동 받는 것을 본다.


- copy coding -


4.4 비트연산


비트연산은 말 그대로 0, 1을 가지고 하는 연산으로 두 이미지의 동일한 위치에 대한 AND, OR, NOT, XOR 연산을 진행 합니다.


예제를 보면 참 단순한데 이미지에서 배경을 지우거나 뭔가 찾아내거나 하는데 사용이 됩니다.

  

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

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

cv2.bitwise_not(src[, dst[, mask]]) → dst

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

 

parameter

내용

src1

이미지 파일

src2

이미지 파일

dst

결과 파일

mask

적용 영역 지정

 

기능이 단순해서 예제도 흔한 내용 입니다.


import numpy as np

import cv2

 

imgFile1 = 'F:/Python/images/image_calcu001.png'

imgFile2 = 'F:/Python/images/image_calcu002.png'

 

# image read

img1 = cv2.imread(imgFile1)

img2 = cv2.imread(imgFile2)

 

bit_and = cv2.bitwise_and(img1, img2)

bit_or = cv2.bitwise_or(img2, img1)

bit_not = cv2.bitwise_not(img2)

bit_xor = cv2.bitwise_xor(img2, img1)

 

 

cv2.imshow("bit_and", bit_and)

cv2.imshow("bit_or", bit_or)

cv2.imshow("bit_not", bit_not)

cv2.imshow("bit_xor", bit_xor)

 

cv2.waitKey(0)

cv2.destroyAllWindows()



- 원본 이미지


두개의 원본 이미지가 있습니다색이 없으면 검게 보이고(0) 색이 있으면 흰색(1)으로 표현 됩니다.


opencv_bit_add


opencv_bit_add


4.4.1 and 연산


두 그림에서 모두 흰색(1)인 부분만 흰색으로 나타 납니다.


A

0

0

1

1

B

0

1

0

1

A and B

0

0

0

1

 

opencv_bit_add


 

4.4.2 or 연산


두 그림에서 모두 검은색(0)인 부분만 검정색으로 나타 납니다.

 

A

0

0

1

1

B

0

1

0

1

A or B

0

1

1

1


opencv_bit_add


 

4.4.3 not 연산


B 그림에서 색이 반대로 나타 납니다.

 

B

0

1

not B

1

0


opencv_bit_add


 

4.4.4 xor 연산


두 그림에서 값이 서로 같으면 검은색 같지 않으면 흰색으로 나타 납니다.

 

A

0

0

1

1

B

0

1

0

1

A xor B

0

1

1

0

 

opencv_bit_add


1···77787980818283···118

+ Recent posts