Threshold에 대해서 이미 OpenCV 5.임계처리에서 설명을 하였는데 자료를 정리 하다가 조금 다른 방법으로 다시 정리해 보았습니다.

 

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

Parameter

설명

src

입력 이미지 : single-channel, 8-bit or 32-bit floating point(input array)

thresh

threshold value(임계 값)

maxval

임계값을

type

thresholding type

- cv2.THRESH_BINARY : 픽셀이 thresh 보다 크면 maxval, 작으면 0

- cv2.THRESH_BINARY_INV : 픽셀이 thresh 보다 작으면 0, 크면 maxval

- cv2.THRESH_TRUNC : 픽셀이 thresh 보다 크면 maxval, 작으면 변경 없음

- cv2.THRESH_TOZERO : 픽셀이 thresh 보다 크면 변경 없음, 작으면 0

- cv2.THRESH_TOZERO_INV : 픽셀이 thresh 보다 크면 0, 작으면 변경 없음

dst

output array : src와 동일 size

 

threshold는 이미지를 grayscale로 불러와 픽셀 하나하나를 기준 값과 비교하여 기준 값을 초과하는 경우와 미달하는 경우로 나누어 새로운 값으로 설정 합니다예를 들어 커트라인을 90으로 설정 했다고 하면 하나의 픽셀 값을 가져와 90하고 비교해서 크면 A , 작으면 B 값으로 다시 설정하는 이분법적 방법으로 색상을 새로 설정 하게 됩니다이렇게 하면 특정 값 이하를 제거 하거나 특정 값 이상을 제거할 수 있겠죠.

 

import cv2

import numpy as np

from matplotlib import pyplot as plt

 

img = cv2.imread('D:/tensorflow/images/mickey.jpg', cv2.IMREAD_GRAYSCALE)

 

ret, thresh1 = cv2.threshold(img,99,255, cv2.THRESH_TRUNC)

ret, thresh2 = cv2.threshold(thresh1, 49,255, cv2.THRESH_TRUNC)

 

titles =['Original','TRUNC 99','TRUNC 49']

images = [img,thresh1,thresh2]

 

for i in range(3):

    plt.imshow(images[i], 'gray')

    plt.title(titles[i])

    plt.show()

 

opencv threshold


이 프로그램은 이미지를 하나 가져와 픽셀이 99보다 크면 255(흰색)으로 설정하고 설정된 그림을 다시 45보다 큰 값을 가지면 255(흰색)로 설정하는 프로그램 입니다.  실제 적용한 이미지를 가지고 설명을 하면


opencv threshold


미키마우스 이미지에 바탕색을 100인 옅은 회색으로 칠하고 거기에 50인 네모를 추가하여 이미지를 하나 만든 후 추가된 색상을 제거해 나가는 방식으로 원본 이미지를 복원하는 작업을 해보았습니다이미지에 따라 어떤 thresholding type을 사용할지 선택을 하고 어떤 값을 가진 부분부터 제거해 나갈지 설정을 하여 작업을 해나가면 원하는 이미지를 찾을 수 있습니다


- copy coding -



점점 커져만 가는 프로그램들 때문에 100GB면 충분하리라 생각했던 C 드라이브가 꽉 차서 더 이상 새로운 프로그램을 설치 하지도 못하고 기존 프로그램도 사용하기 힘든 상황이 되었습니다그래서 500GB 하나를 추가하고 기존 250GB는 오로지 운영체제로만 사용하려고 합니다그냥 다 밀어버리고 새로 윈도우를 설치하면 깔끔하겠지만 지금까지 설치한 프로그램들을 다시 복구 하려니 그건 안되겠고 현재 사용하는 환경에서 파티션을 합치려고 합니다.  [컴퓨터 관리] 프로그램을 실행해서 디스크 상태를 보면 아래 이미지의 [디스크 1]이 작업하려는 하드디스크 입니다.


windows c partition 확대


기존 파티션을 삭제하고 결합하는 방법은 크게 3가지 방법으로 작업할 수 있습니다.

1. [컴퓨터 관리] 프로그램 사용(Windows 기본 프로그램)

2. 명령 프롬프트에서 [diskpart] 명령어 사용(Windows 기본 프로그램)

3. 기타 파티션 관리 프로그램 사용(유료 또는 무료 프로그램)

 

1[컴퓨터 관리] 프로그램은

Windows에 포함된 프로그램으로 위의 그림에 있는 [디스크 0](주 파티션)과 같은 경우에는 해당 파티션에 마우스를 놓고 우측 버튼을 클릭해서 나오는 팝업 메뉴에서 파티션을 삭제하고 확장하는 등의 작업을 할 수 있지만 [디스크 1]의 운영체제가 있는 파티션의 경우에는 기능이 비활성화 되어 있어서 사용할 수 없습니다.

 

2번 역시 Windows에 포함된 프로그램으로

[디스트 1](복구 파티션) 정도는 삭제를 할 수 있지만 (부팅, 페이지 파일) 파티션은 삭제 작업이 불가능 합니다.

 

1번 방법은 마우스 클릭만 하면 되니 생략 하고 2diskpart 명령을 이용하는 방법을 간단하게 알아보겠습니다. (: 이후는 설명을 달아놓은 것 입니다.)

 

C:\>diskpart : diskpart 프로그램을 실행하는 명령어

DISKPART> list disk : 디스트 목록 조회

DISKPART> select disk (숫자) : 작업을 위해 disk 번호 선택

DISKPART> list partition : 선택한 disk 1에 있는 파티션 목록 조회

DISKPART> select partition (숫자) : 작업을 위한 파티션 번호 선택

DISKPART> clean : 파티션 정보 삭제

DISKPART> delete partition override : 파티션 삭제

DISKPART> exit : diskpart 프로그램 종료 명령어

C:\>

 

이런 순서로 작업을 하면 위에서 보았던 이미지의 [디스크 0]에 있는 파티션들은 쉽게 삭제 및 확장 등을 할 수 있습니다일반적인 경우 clean 명령은 사용 안해도 작업이 가능하고 delete partition override 명령으로 삭제가 안되는 경우에는 사용해야 합니다. 실제로 diskpart 명령어를 사용하여 [디스크 1]에 있는 818MB(복구파티션)을 삭제하는 해보도록 하겠습니다.

 

C:\>diskpart

 

Microsoft DiskPart 버전 10.0.16299.15

 

Copyright (C) Microsoft Corporation.

컴퓨터: DESKTOP-E01LQNQ

 

DISKPART> list disk

 

  디스크 ###  상태           크기     사용 가능     Dyn  Gpt

  ----------  -------------  -------  ------------  ---  ---

  디스크 0    온라인        465 GB       1024 KB

  디스크 1    온라인        238 GB       2048 KB        *

 

DISKPART> select disk 1

 

1 디스크가 선택한 디스크입니다.

 

DISKPART> list partition

 

  파티션 ###  종류              크기     오프셋

  ----------  ----------------  -------  -------

  파티션 1    복구                 450 MB  1024 KB

  파티션 2    시스템                100 MB   451 MB

  파티션 3    예약됨                 16 MB   551 MB

  파티션 4                       96 GB   567 MB

  파티션 5    복구                 818 MB    97 GB

  파티션 6                      140 GB    98 GB

 

DISKPART> select partition 5

 

5 파티션이 선택한 파티션입니다.

 

DISKPART> clean

 

가상 디스크 서비스 오류:

현재 부팅, 시스템, 페이지 파일, 크래시 덤프 또는 최대 절전 모드

볼륨이 들어 있는 디스크는 정리할 수 없습니다.

 

DISKPART> delete partition override

 

DiskPart에서 선택한 파티션을 삭제했습니다.

 

DISKPART>

 

windows c partition 확대


이렇게 파티션 5(복구 파티션)이 삭제되고 [할당되지 않음]으로 표시 됩니다

그러나 원래 삭제 하려던 140GB 용량의 E:\ 파티션 6diskpart 명령으로 삭제하려고 하면


windows c partition 확대


이렇게 clean 명령도 delete partition override 명령도 모두 오류가 발생하고 삭제가 되지 않습니다

파티션 리스트를 보면 [파티션 5]는 삭제가 되어 리스트에 나오지 않습니다일단 삭제된 파티션 5 C:\ 드라이브와 합쳐 봅니다.


windows c partition 확대


C:\에 마우스를 놓고 [볼륨 확장] 메뉴를 선택 합니다.


windows c partition 확대


볼륨 확장 마법사가 나오는데 [다음] 버튼을 클릭 합니다.


windows c partition 확대


그러면 기본적으로 C:\의 우측에 있는 할당되지 않은 818GB가 선택 됩니다물론 전체 공간이 선택 되어 있으니 그냥 [다음] 버튼을 클릭 합니다.


windows c partition 확대


C:\ 볼륨이 확장 되었습니다.  [마침] 버튼을 클릭 합니다.


windows c partition 확대


C:\96.86에서 97.65로 확장 되었습니다

 

3번 방법을 사용하여 E:\를 작업해 봅니다.

Windows에 포함된 프로그램으로는 E:\ 드라이브 파티션을 삭제할 수 없으니 인터넷에서 프로그램을 다운받아 작업을 진행 해야 합니다많은 프로그램이 있겠지만 여기서는 aomei 라는 프로그램을 사용합니다. 사용 방법과 화면 구성이 Windows 에서 제공하는 [컴퓨터 관리] 프로그램과 비슷해서 친숙합니다.  그리고 무료로 지금 하려는 기능을 사용할 수 있고 더많은 기능이 필요하다면 유료를 이용하면 됩니다. 

먼저 사이트에 방문하여

https://www.aomeitech.com/


windows c partition 확대


상단에서 Partition Manager 메뉴를 찾아서 다운로드 페이지에서 중간에 있는 Windows 용 프로그램을 다운로드 하고 실행 하면 설치가 진행됩니다


windows c partition 확대


언어는 그냥 영어로 [OK] 버튼 클릭


windows c partition 확대


Pro를 사용할 것 까지는 없으니 좌측에 있는 [Skip] 버튼을 클릭 합니다


windows c partition 확대


[Install Now]를 선택 하고


windows c partition 확대


설치가 완료 되었습니다.   [Enjoy Now]를 선택 하면 바로 디스크 상황을 보여줍니다.  C:\ 드라이브에 마우스를 놓고 우측 버튼을 클릭해서 팝업 메뉴를 띄웁니다.


windows c partition 확대


이 프로그램은 파티션 삭제 작업도 활성화 되어 있습니다.  E:\를 삭제 하고 다시 C:\를 확장하는 번거로운 작업을 하지 않고 E:\에 있는 데이터도 살리는 방향으로 작업을 하려면 [Merge Partitions] 메뉴를 선택 합니다


windows c partition 확대


[Merge Partitions] 작업 창이 나오고 파티션 리스트가 보이는데 C:\E:\를 체크 하고 [OK] 버튼을 클릭 합니다.


windows c partition 확대


C:\E:\를 머지한 결과의 상태를 보여줍니다. 한마디로 미리보기 이고요. 실제로 작업을 진행 하려면 좌측 상단에 [Apply]가 보이는데 이걸 클릭 해줘야 합니다.


windows c partition 확대


진짜 진행 할건지 물어보는데 당연히 [Proceed] 버튼을 선택 합니다.


windows c partition 확대


머지 작업이 완료 되었다는 군요. Restart를 선택하고 [OK버튼을 클릭하면 운영체제가 다시 시작하니 저장할 것이 있으면 미리 저장하고 진행 하세요.

재부팅 하면서 파티션 작업을 마무리 합니다이제 윈도우에서 [컴퓨터 관리] 프로그램을 실행해 보면 머지가 되고 드디어 C:\만 남았습니다.


windows c partition 확대


목표는 완료 했고 C:\를 더이상 확장할 일은 없으니 AOMEI는 삭제해 버렸습니다만약 C:\를 여러 개의 파티션으로 분할 해야 한다면 지금 보는 [컴퓨터 관리] 프로그램으로도 가능 합니다.


- copy coding -



이미지의 밝기 분포를 나타내는 표입니다밝기는 0에서 255 단계까지(0은 검은색, 255는 하얀색) 정의해 놓습니다.  이미지를 픽셀에 단위로 분해 하고 픽셀 별로 명암 값(0에서 255)을 구하여 밝기가 0인 픽셀의 총계, 1인 픽셀의 총계.... 255인 픽셀의 총계를 구하여 도표로 보여주는 것 입니다도표의 x축은 명암 0~255 이고 y축은 명암 별 픽셀 개수를 나타냅니다.

 

0에 가까운 값을 가진 픽셀이 많다면 이미지가 너무 어두울 테고 255쪽의 값을 가진 픽셀이 많다면 너무 밝은 이미지라고 할 수 있습니다.


opencv python histogram

 

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) → hist

 

parameter

설명

images

이미지 파일

channels

분석 채널(0:gray, 1:

mask

히스토그램을 계산할 영역

histSize

히스토그램 (BIN)의 개수. [256]

ranges

계산 범위 [0, 256]

hist

계산 결과

accumulate

누적 여부. true이면 초기화 하지 않고 이전 값을 계속 누적

 

6.1 흑백 이미지


검은 색과 흰색의 영역이 동일한 이미지를 이용하여 테스트를 진행해 봅니다물론 실제 사용하는 이미지에는 테두리가 없습니다.


opencv python histogram

 

import cv2

import numpy as np

from matplotlib import pyplot as plt

 

img = cv2.imread('D:/tensorflow/images/image_calcuHist001.png', 0)

 

hist = cv2.calcHist([img], [0], None, [256], [0, 256])

 

plt.plot(hist)

plt.show()

 

opencv python histogram


그래프를 보면 픽셀의 명암 값이 0인 개수와 255인 픽셀의 개수가 동일 하다는 걸 확인할 수 있습니다.

 

6.2 컬러 이미지

 

컬러 이미지를 이용하여 테스트를 진행해 봅니다. 파랑색 블럭과 녹색, 붉은색 블럭의 크기가 동일 하도록 이미지를 준비 하였습니다.


opencv python histogram

 

import cv2

import numpy as np

from matplotlib import pyplot as plt

 

img = cv2.imread(‘D:/tensorflow/images/image_calcuHist003.png’, 1)

 

hist = cv2.calcHist([img], [2], None, [256], [0, 256])

 

plt.subplot(2,2,1), plt.imshow(img)

plt.subplot(2,2,2), plt.plot(hist)

#plt.plot(hist)

 

plt.show()

 opencv python histogram


컬러값을 만들 때 파란색은 [0, 0, 255]로 표현 되는데 값의 두 개 중 하나만 255이고 나머지는 0으로 표현 됩니다, B[0,0,255], G[0,255,0], R[255,0,0] 이런 식으로 255보다 0이 두 배 많게 나옵니다결과적으로 그래프의 값도 255의 픽셀 값보다 0의 값을 가진 픽셀이 2배 많다는 것을 나타내고 있습니다.


위의 두 경우 모두 너무 극단적인 예제들 이었고 실제 사진을 가지고 테스트를 해보겠습니다아래사진은 저녁에 도로를 찍어서 좀 어둡습니다.


opencv python histogram


opencv python histogram


히스토그램 결과도 0에 가까운 값들이 많은걸 알 수 있습니다이런 식으로 히스토그램을 이용하면 사진을 안보고도 어떤 느낌인지 대충 예상할 수 있겠네요.


 

6.3 히스토그램 균일화(평활화) : Histogram Equalization


이미지의 히스토그램 결과가 한쪽으로 몰려있는 경우 너무 밝거나 어둡게 보이는데 가능하면 골고루 분포되도록 조절을 하는 작업을 균일화 또는 평활화 하고 합니다.

 

import cv2

import numpy as np

 

img = cv2.imread('D:/tensorflow/images/image_calcuHist004.png');

 

hist, bins = np.histogram(img.ravel(), 256,[0,256]) # 히스토그램 구하기

cdf = hist.cumsum() #numpy 배열을 1차원으로 하고 더한 값을 누적하여 배열 생성

 

cdf_m = np.ma.masked_equal(cdf,0) #cdf에서 값이 0인 부분을 mask하여 제외 처리

cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min()) #여기가 균일화 방정식

cdf = np.ma.filled(cdf_m,0).astype('uint8') #mask로 제외했던 0값을 복원

 

img2 = cdf[img]

 

cv2.imshow('Equalization', img2)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

opencv python histogram


어둡던 이미지가 많이 밝아졌습니다어둠에 묻혀있던 사물들이 좀더 선명해진 것을 확인할 수 있습니다길을 걷는 사람이 조금 포함된걸 알기는 했는데 무슨 상표 옷인지 눈에 확들어오네요.


- copy coding -


예전에 아나콘다에 텐서플로우를 설치하는 방법을 올렸었는데 Tensorflow2를 사용하기 위해 다시 설치를 해보았습니다.  예전에는 텐서플로우가 사용하는 python과 아나콘다에서 사용하는 파이썬 버전을 맞추기 위하여 다운로드 사이트를 찾아 다녔지만 이제는 그냥 각각 최신 버전을 다운받아서 설치해도 되기 때문에 작업이 수월해 졌습니다.

 

anaconda tensorflow2 install


TensorFlow 사이트에 가보면

https://www.tensorflow.org/install


anaconda tensorflow2 install


Python 3.5 부터 3.8을 지원하고 있습니다.

 

아나콘다 사이트에 가면


anaconda tensorflow2 install


최신 버전이 Python 3.8을 지원하고 있습니다설치 방법은 단순해서 설명을 하지 않아도 될 정도이지만 간단하게 진행해 보겠습니다.

 

1. Anaconda 설치

 

아나콘다에서 자신의 컴퓨터에 적합한 파일을 다운로드 받습니다.

https://www.anaconda.com/products/individual

컴퓨터 시스템 종류는 단축키를 이용할 때는 [윈도우 키 + Pause ]를 누르거나 [바탕화면 내PC에서 마우스 우측 버튼 > 속성] 또는 [파일 탐색기 컴퓨터에서 마우스 우측버튼 > 속성]을 선택하면 시스템 정보에서 확인 가능 합니다.

저는 64-Bit Graphical Installer를 다운로드 받았습니다아나콘다는 다운받은 파일을 실행해서 그냥 [Next] 버튼만 눌러주면 설치가 완료 됩니다한번 볼까요?


anaconda tensorflow2 install


[Next] 버튼을 클릭 합니다.


anaconda tensorflow2 install




anaconda tensorflow2 install


이런 틀렸네요. [I Agree] 버튼을 클릭 합니다.


anaconda tensorflow2 install


[Next] 버튼을 클릭 합니다.. 저는 기본설정이 아닌 C:\anaconda3에 설치를 했습니다.


anaconda tensorflow2 install


[Next] 버튼을 클릭 합니다.


anaconda tensorflow2 install


[Next] 버튼을 클릭 합니다.


anaconda tensorflow2 install


[Next] 버튼을 클릭 합니다.


anaconda tensorflow2 install


[Next] 버튼을 클릭 합니다.


anaconda tensorflow2 install


설치 작업이 완료 되었습니다. [Finish] 버튼을 클릭 합니다.


설치가 잘 되었는지 확인해 봅니다.


anaconda tensorflow2 install


Anaconda Prompt를 선택하여 콘솔모드에서 python 버전을 확인합니다.


pthon -V


anaconda tensorflow2 install


설치가 잘 되었습니다.

 


2. TensorFlow 2 설치


 

텐서플로우는 아나콘다에서 파이썬 버전을 확인 했던 Anaconda Prompt에서 진행을 합니다.



1) 먼저 pip을 업그레이드 해줍니다.


pip install –upgrade pip


anaconda tensorflow2 install


2) 가상환경 생성

 

가상환경 또는 프로젝트을 생성 한다고도 하는데 아나콘다에 텐서플로우만 사용하는 공간을 생성해주는 명령어 입니다물론 tensorflow 말고 다른 단어를 사용해도 됩니다. 뒤에 사용하려는 파이썬 버전을 기입해서 선택해도 됩니다.

 

conda create -n tensorflow pip python=3.8


anaconda tensorflow2 install


anaconda tensorflow2 install


중간에 진행 할거냐고 물어보는데 y를 입력하고 엔터 키.

이제부터 실제 텐서플로우 설치 작업이 시작 되는데 모두 동일한 방법이어서 화면 캡처 없이 명령어만 나열해 보았습니다순서대로 입력하고 엔터키를 누르면 됩니다.

 

3) 가상환경으로 이동


새로 만든 tensorflow라는 가상환경을 활성화 해줍니다.

 

conda activate tensorflow

 

4) 텐서플로우 설치


CPU 버전인 경우

pip install --ignore-installed --upgrade tensorflow-cpu

 

GPU 버전인 경우

pip install --ignore-installed --upgrade tensorflow-gpu

 

여기까지 진행 하면 설치가 완료 됩니다.

텐서플로우 사이트에 가면 CPUGPU가 통합된 버전을 설치하라고 되어 있습니다.

 

# Requires the latest pip
pip install --upgrade pip

# Current stable release for CPU and GPU
pip install tensorflow

# Or try the preview build (unstable)
pip install tf-nightly

 

 

3. 설치 테스트


설치가 끝났으니 테스트를 진행합니다먼저 Tensorflow2에서는 Session(), print()에서 오류가 발생 하는데 명령어가 변경이 되었다고 하니 찾아보면 됩니다그 이외에도 AVX2, XLA관련 오류도 발생 하는데 무시 하거나 소스를 가져와 컴파일 하면 됩니다.


anaconda tensorflow2 install

 

(tensorflow) C:\>python

Python 3.8.5 (default, Sep  3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

>>> with tf.compat.v1.Session() as sess:

...   hello = tf.constant("Hello World!")

...   print(sess.run(hello))

...

2020-10-01 01:15:02.895615: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations:  AVX2

To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.

2020-10-01 01:15:02.941595: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x21879054d00 initialized for platform Host (this does not guarantee that XLA will be used). Devices:

2020-10-01 01:15:02.957403: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version

b'Hello World!'

>>> 

 

오류 때문에 뭘 하고 있는지 화가 난다면 편안하게 jupyter를 사용 합니다.

 

import tensorflow as tf

 

hello = tf.constant("Hello World!")

tf.print(hello)

 

보면 알겠지만 가능하면 Session()은 사용하지 말고 print()tf에서 사용해 줍니다.


anaconda tensorflow2 install


소스가 간단해 지고 가독성도 좋아진것 같습니다.


- copy coding -


12345678···62

+ Recent posts