Opencv 명암 대비 | 파이썬 코딩 무료 강의 (활용편6) – Opencv 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요 빠른 답변

당신은 주제를 찾고 있습니까 “opencv 명암 대비 – 파이썬 코딩 무료 강의 (활용편6) – OpenCV 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요“? 다음 카테고리의 웹사이트 https://you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 나도코딩 이(가) 작성한 기사에는 조회수 166,323회 및 좋아요 3,149개 개의 좋아요가 있습니다.

opencv 명암 대비 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 파이썬 코딩 무료 강의 (활용편6) – OpenCV 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요 – opencv 명암 대비 주제에 대한 세부정보를 참조하세요

파이썬 무료 강의 (활용편6 – 이미지 처리)입니다.
OpenCV 를 이용한 다양한 이미지 처리 기법과 재미있는 프로젝트를 진행합니다.
누구나 볼 수 있도록 쉽고 재미있게 제작하였습니다. ^^
* 본 영상은 기본편을 학습한 분들을 위한 강의입니다.
파이썬을 처음 접하신다면, 아래 기본편을 먼저 공부해주세요 ^^
[ 기본편 ]파이썬은 다양한 활용 분야가 있는 인기 최고의 프로그래밍 언어입니다.
수많은 컴퓨터 교육 기관에서 가르치고 있으며 학생들도 배우고 있지요.
여러분의 가치를 훨씬 높일 수 있는 필살기,
지금 바로 시작하세요 !
바로가기 : https://youtu.be/kWiCuklohdY

[ 활용편 커리큘럼 ]* 활용편은 제작 중입니다.
1. 게임 개발 [완료]
– 오락실에서 하던 Pang 게임
– 바로가기 : https://youtu.be/Dkx8Pl6QKW0
2. GUI 프로그래밍 [완료] – 영상에서 캡처한 이미지들을 하나로 합치는 프로그램
– 바로가기 : https://youtu.be/bKPIcoou9N8
3. 웹스크래핑 [완료] – 내가 원하는 뉴스를 매일 자동으로 긁어오는 프로그램
– 바로가기 : https://youtu.be/yQ20jZwDjTE
4. 업무자동화 [완료] – 엑셀, 인터넷, 데스크탑 등 컴퓨터에게 일을 시키는 스크립트
– 바로가기 : https://youtu.be/exgO1LFl9x8
5. 데이터 분석 및 시각화 [완료] – 빅데이터를 활용한 대한민국의 인구 문제 분석
– 바로가기 : https://youtu.be/PjhlUzp_cU0
6. 이미지 처리 [완료] – 이미지 / 영상에서 얼굴을 인식하여 얼굴 위에 재밌는 캐릭터 씌우기
7. 머신러닝 [완료] – 머신러닝을 이용하여 나만의 영화 추천 시스템 만들기
– 바로가기 : https://youtu.be/TNcfJHajqJY
8. 사물인터넷
– 아두이노를 활용한 RC Car 제작

[목차][소개](0:00:00) 0.Intro
(0:00:31) 1.소개
(0:02:18) 2.활용편 6 이미지 처리 소개
[OpenCV 전반전](0:04:36) 3.환경설정
(0:08:41) 4.이미지 출력
(0:21:51) 5.동영상 출력 #1 파일
(0:29:58) 6.동영상 출력 #2 카메라
(0:34:23) 7.도형 그리기 #1 빈 스케치북
(0:39:49) 8.도형 그리기 #2 영역 색칠
(0:42:26) 9.도형 그리기 #3 직선
(0:51:23) 10.도형 그리기 #4 원
(0:55:09) 11.도형 그리기 #5 사각형
(0:58:32) 12.도형 그리기 #6 다각형
(1:09:23) 13.텍스트 #1 기본
(1:17:45) 14.텍스트 #2 한글 우회
(1:24:14) 15.파일 저장 #1 이미지
(1:29:27) 16.파일 저장 #2 동영상
(1:39:29) 17.크기 조정
(1:50:16) 18.이미지 자르기
(1:57:03) 19.이미지 대칭
(2:01:46) 20.이미지 회전
(2:06:07) 21.이미지 변형 – 흑백
(2:11:25) 22.이미지 변형 – 흐림
(2:18:03) 23.이미지 변형 – 원근 #1
(2:27:45) 24.이미지 변형 – 원근 #2
[반자동 문서 스캐너 프로젝트](2:32:50) 25.미니 프로젝트 1 – #1 마우스 이벤트 등록
(2:42:06) 26.미니 프로젝트 1 – #2 기본 코드 완성
(2:49:54) 27.미니 프로젝트 1 – #3 지점 선 긋기
(2:55:24) 28.미니 프로젝트 1 – #4 실시간 선 긋기
[OpenCV 후반전](3:01:52) 29.이미지 변형 – 이진화 #1 Trackbar
(3:14:37) 30.이미지 변형 – 이진화 #2 임계값
(3:20:26) 31.이미지 변형 – 이진화 #3 Adaptive Threshold
(3:28:34) 32.이미지 변형 – 이진화 #4 오츠 알고리즘
(3:32:22) 33.이미지 변환 – 팽창
(3:41:10) 34.이미지 변환 – 침식
(3:45:56) 35.이미지 변환 – 열림 \u0026 닫힘
(3:54:10) 36.이미지 검출 – 경계선
(4:05:08) 37.이미지 검출 – 윤곽선 #1 기본
(4:15:26) 38.이미지 검출 – 윤곽선 #2 찾기 모드
(4:20:46) 39.이미지 검출 – 윤곽선 #3 면적
[카드 검출 \u0026 분류기 프로젝트](4:27:42) 40.미니프로젝트 2
[퀴즈](4:31:57) 41.퀴즈
[얼굴인식 프로젝트](4:41:25) 42.환경설정 및 기본 코드 정리
(4:54:48) 43.눈과 코 인식하여 도형 그리기
(5:10:42) 44.그림판 이미지 씌우기
(5:20:52) 45.캐릭터 이미지 씌우기
(5:33:10) 46.보충설명
(5:40:53) 47.마치며 (학습 참고 자료)
(5:42:18) 48.Outro

[학습자료]수업에 필요한 이미지, 동영상 자료 링크입니다.
고양이 이미지 : https://pixabay.com/images/id-2083492/
크기 : 640 x 390
파일명 : img.jpg
고양이 동영상 : https://www.pexels.com/video/7515833/
크기 : SD (360 x 640)
파일명 : video.mp4
신문 이미지 : https://pixabay.com/images/id-350376/
크기 : 1280 x 853
파일명 : newspaper.jpg
카드 이미지 1 : https://pixabay.com/images/id-682332/
크기 : 1280 x 1019
파일명 : poker.jpg
책 이미지 : https://www.pexels.com/photo/1029807/
크기 : Small (640 x 853)
파일명 : book.jpg
눈사람 이미지 : https://pixabay.com/images/id-1300089/
크기 : 1280 x 904
파일명 : snowman.png
카드 이미지 2 : https://pixabay.com/images/id-161404/
크기 : 640 x 408
파일명 : card.png
퀴즈용 동영상 : https://www.pexels.com/video/3121459/
크기 : HD (1280 x 720)
파일명 : city.mp4
프로젝트용 동영상 : https://www.pexels.com/video/3256542/
크기 : Full HD (1920 x 1080)
파일명 : face_video.mp4
프로젝트용 캐릭터 이미지 : https://www.freepik.com/free-vector/cute-animal-masks-video-chat-application-effect-filters-set_6380101.htm
파일명 : right_eye.png (100 x 100), left_eye.png (100 x 100), nose.png (300 x 100)
무료 이미지 편집 도구 : https://pixlr.com/kr/
(Pixlr E -Advanced Editor)

[ 연락 ][email protected]
* 질문은 댓글을 통해서 해주세요 ^^

Images, Videos by pixabay, pexels
: https://www.pixabay.com
: https://www.pexels.com
Designed by freepik
: https://www.freepik.com

opencv 명암 대비 주제에 대한 자세한 내용은 여기를 참조하세요.

OpenCV – 영상의 밝기/명암 조절 – 루카쓰로그

이미지 명암비(대비) 조절Permalink. 명암비 = 이미지의 밝은 부분과 어두운 부분의 밝기 차를 의미. 명암비 조절은 이미지의 밝은 부분은 …

+ 여기에 보기

Source: lucathree.github.io

Date Published: 2/20/2021

View: 1511

영상의 명암비(Contrast) 조절 – 임이지의 블로그

명암비(Contrast)란? 밝은 곳과 어두운 곳 사이에 드러나 는 밝기 정도의 차이이다. 컨트라스트, 대비라고 도 한다. dst(x, y) = saturate(s * src(s, …

+ 여기에 보기

Source: overface.tistory.com

Date Published: 12/8/2021

View: 960

파이썬 openCV 5. 명암대비 스트레칭(streching)

파이썬 openCV 5번째 강의는 명암대비 스트레칭입니다. 여러분들도 근육이 뭉쳤을때 스트레칭을 통해 근육을 풀어주곤 하죠?

+ 여기에 자세히 보기

Source: marisara.tistory.com

Date Published: 6/23/2022

View: 8691

[파이썬 OpenCV] 영상의 명암비 조절 – 히스토그램 스트레칭 …

황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다. 영상의 명암비 조절 명암비(Contrast)는 밝은 곳과 어두운 곳 사이에 드러나는 밝기 정도 …

+ 자세한 내용은 여기를 클릭하십시오

Source: deep-learning-study.tistory.com

Date Published: 6/27/2022

View: 5098

OpenCV | 영상의 명암비 조절 – velog

명암비란 영상에서 밝은 영역과 어두운 영역사이에 드러나는 밝기 차이의 강도를 의미하고, 명암 대비 또는 콘트라스트 라고도 한다.

+ 여기에 보기

Source: velog.io

Date Published: 2/18/2022

View: 2545

[OpenCV] 밝기와 명암

파일을 읽어올때 채널(channel) 차원을 1로해서 읽어와야 그레이스케일 영상을 받아올 수 있다. 그레이스케일을 입력받는 함수에 컬러 영상을 입력하면 …

+ 여기에 표시

Source: zzzinho.tistory.com

Date Published: 8/20/2021

View: 3874

openCV를 사용한 영상의 밝기와 명암비 조절

행렬의 덧셈과 뺄셈으로 간단하게 영상의 밝기 조절 가능. openCV에서 제공하는 영상의 밝기 조절; 사용자가 직접 영상의 픽셀 값을 참조하여 밝기 …

+ 자세한 내용은 여기를 클릭하십시오

Source: min-jjiny.tistory.com

Date Published: 1/10/2021

View: 6876

주제와 관련된 이미지 opencv 명암 대비

주제와 관련된 더 많은 사진을 참조하십시오 파이썬 코딩 무료 강의 (활용편6) – OpenCV 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

파이썬 코딩 무료 강의 (활용편6) - OpenCV 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요
파이썬 코딩 무료 강의 (활용편6) – OpenCV 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요

주제에 대한 기사 평가 opencv 명암 대비

  • Author: 나도코딩
  • Views: 조회수 166,323회
  • Likes: 좋아요 3,149개
  • Date Published: 2022. 1. 16.
  • Video Url link: https://www.youtube.com/watch?v=XK3eU9egll8

OpenCV – 영상의 밝기/명암 조절

이미지 밝기 조절

픽셀값은 255에 가까울수록 밝고, 0에 가까울수록 어둡다. 이 점을 활용하여 픽셀 값에 값을 더하거나 빼줌으로서 이미지의 밝기 조절이 가능하다.

img = cv2 . imread ( ‘a.jpg’ ) img2 = img + 20 #이미지 밝게 처리 img3 = img – 20 #이미지 어둡게 처리

포화연산

그런데, 색상 값은 0-255 사이의 값을 가지는데 +, – 연산을 수행하면 0보다 작거나 255보다 큰 값을 만들어낼 수도 있다.

하지만 이미지 값의 타입은 uint8, 8비트 숫자 255까지만 표현이 가능하기 때문에 256은 이진수로 100000000(2) 9비트가 필요하여 uint8 형식에서는 다시 0이 된다. 이렇게 처리되면 아주 밝은 부분이 아주 어둡게, 또는 아주 어두운 부분이 아주 밝게 반대로 표현되어 이미지가 변질된다.

그래서 픽셀값이 255를 넘으면 255로, 0 미만이면 0으로 처리하는 것이 포화연산이다.

np.clip을 활용한 포화연산

# np.clip(src, 최소값, 최대값) import numpy as np arr = np . array ([ – 12 , 213 , 307 ]) arr2 = np . clip ( arr , 0 , 255 ) arr2 >>> array ([ 0 , 213 , 255 ])

주의할 점

#1 img2 = img + 100 img3 = np . clip ( img2 , 0 , 255 ) #2 img2 = np . clip ( img + 100 , 0 , 255 ) #3 img2 = img . astype ( ‘int32’ ) img3 = np . clip ( img2 , 0 , 255 ) img3 = img3 . astype ( ‘uint8’ )

위 #1 처럼 코드를 작성할 경우 이미 img2는 uint8로 처리가 되어있기 때문에 np.clip을 해도 소용이 없다. #2 처럼 np.clip 안에서 연산을 진행시키거나 #3 처럼 이미지 타입을 uint8이 아닌 다른 것으로 변환시켜준 후 np.clip을 사용해준 뒤 다시 uint8로 돌려주면 된다.

이미지 명암비(대비) 조절

명암비 = 이미지의 밝은 부분과 어두운 부분의 밝기 차를 의미.

명암비 조절은 이미지의 밝은 부분은 더 밝게, 어두운 부분은 더 어둡게 함으로써 이미지 윤곽을 뚜렷하게 해주어 활용도가 높다.

색상 값을 곱해주기

def saturate_contrast1 ( p , num ): pic = p . copy () pic = pic . astype ( ‘int64’ ) pic = np . clip ( pic * num , 0 , 255 ) pic = pic . astype ( ‘uint8’ ) return pic #명암비를 1보다 작게 주면 밝기 차가 줄어들고 전반적으로 어두어짐 img4 = saturate_contrast1 ( img , 0.5 ) #명암비를 1보다 크게 주면 밝기 차가 커지고 흰색 영역이 넓어짐 img5 = saturate_contrast1 ( img , 2 )

값이 클 수록 배수의 값도 더 커지기 때문에 밝은 부분은 더 밝게, 어두운 부분은 덜 밝게 하는 것이 가능하다.

하지만 밝은 부분은 더 밝게 하고 어두운 부분을 더 어둡게 하는 것은 이 방식으로 되지 않는다.

명암비의 효율적 조절

명암 차이를 크게 만들기 위해서는 밝은 부분은 더 밝게 해주고, 어두운 부분은 더 어둡게 해줘야 한다. 밝고 어두움의 기준으로 0~255의 중간 값인 128을 사용하고, 128보다 더 큰 값은 더 밝게 만들고 128보다 작은 값은 더 어둡게 만들어 대비를 더 크게 만들어주면 된다.

** dst ( x , y ) = src ( x , y ) + ( src ( x , y ) – 128 ) * alpha ** # src(x,y)-128 을 통해 128보다 작은 값은 음수로 만들고 128보다 큰 값은 양수로 만든다 # alpha는 대비를 얼마나 크게 만들 것인지 결정하는 -1 보다 같거나 큰 실수

def saturate_contrast2 ( p , num ): pic = p . copy () pic = pic . astype ( ‘int32’ ) pic = np . clip ( pic + ( pic – 128 ) * num , 0 , 255 ) pic = pic . astype ( ‘uint8’ ) return pic img4 = saturate_contrast2 ( img , – 0.5 ) img5 = saturate_contrast2 ( img , 2 )

히스토그램 분석

주어진 영상의 픽셀 밝기 분포를 조사하여 밝기 및 명암비를 조절할 수 있다.

히스토그램 구하기

히스토그램: 영상의 픽셀 값 분포를 그래프 형태로 표현한 것. 모든 픽셀의 밝기 값들을 구한 후 밝기 값 마다의 픽셀 개수를 세어서 그래프를 구성한다.

히스토그램에서 가로축을 히스토그램의 빈(bin) 이라고 하며 그레이스케일 영상의 경우 256개의 빈을 가진 히스토그램을 구하는 것이 일반적이지만 경우에 따라서 빈 개수를 다르게 할 수도 있다.

히스토그램은 다음 함수를 사용하여 계산한다.

cv2.calcHist([img], channel, mask, histSize, range)

img: 이미지 배열

이미지 배열 channel: 분설할 색상 채널

분설할 색상 채널 mask: 분석할 영역. None이면 이미지 전체를 의미

분석할 영역. None이면 이미지 전체를 의미 histSize: 히스토그램의 크기 = 빈의 개수

히스토그램의 크기 = 빈의 개수 range: x축 값 범위

사용 예

import cv2 from matplotlib import pyplot as plt img = cv2 . imread ( ‘img/lenna.png’ , 0 ) ** hist = cv2 . calcHist ([ img ], [ 0 ], None , [ 256 ], [ 0 , 255 ]) ** plt . subplot ( 2 , 1 , 1 ), plt . imshow ( img , ‘gray’ ) plt . subplot ( 2 , 1 , 2 ), plt . plot ( hist ) plt . xlim ([ 0 , 255 ]) plt . show ()

위 이미지의 밝기를 조절할 경우, 더 밝게 한 경우는 히스토그램이 전체적으로 오른쪽으로 이동하고 더 어둡게 한 경우는 히스토그램이 전체적으로 왼쪽으로 이동한다.

명암비를 크게 주면 분포가 아주 밝고 아주 어두운 쪽으로 이동하게 되며,

img = saturate_contrast2 ( img , 2 ) # 위에서 사용했던 명암비 조절 함수, 명암비 2 hist = cv2 . calcHist ([ img ],[ 0 ], None ,[ 256 ],[ 0 , 256 ]) plt . subplot ( 2 , 1 , 1 ), plt . imshow ( img4 , ‘gray’ ) plt . subplot ( 2 , 1 , 2 ), plt . plot ( hist , color = ‘r’ ) plt . xlim ([ 0 , 256 ]) plt . show ()

명암비를 줄이면 분포 영역이 더 작아진다. 이는 이미지 색상이 비슷한 값에 몰려있다는 뜻이며 이미지가 선명하지 않음을 나타낸다.

img = saturate_contrast2 ( img , – 0.8 ) # 위에서 사용했던 명암비 조절 함수, 명암비 -0.8 hist = cv2 . calcHist ([ img ],[ 0 ], None ,[ 256 ],[ 0 , 256 ]) plt . subplot ( 2 , 1 , 1 ), plt . imshow ( img4 , ‘gray’ ) plt . subplot ( 2 , 1 , 2 ), plt . plot ( hist , color = ‘r’ ) plt . xlim ([ 0 , 256 ]) plt . show ()

히스토그램 스트레칭 (histogram stretching)

위 이미지 처럼 명암비가 낮아 히스토그램이 특정 구간에 집중되어 있을 때 히스토그램을 펼쳐서 그래프가 그레이스케일 전 구간에서 나타나도록 변환하는 기법을 히스토그램 스트레칭이라 한다.

히스토그램 스트레칭을 수행하면 명암비가 높아지기 때문에 흐릿한 이미지가 더 선명해진다.

히스토그램 스트레칭을 수식으로 표현하면 다음과 같다.

** dst ( x , y ) = (( src ( x , y ) – 최소픽셀값 ) / ( 최대픽셀값 – 최소픽셀값 )) * 255 **

원본(src)에서 최소픽셀값을 빼 결과물(dst)의 최소픽셀값이 0이 되도록 하고, 히스토그램의 범위(최대픽셀값 – 최소픽셀값)로 나눈 값에 255를 곱해 결과물(dst)의 최대픽셀값은 255가 되도록 한다.

이 과정을 코드로 구현하면 다음과 같다

f_max = src . max () # 최대픽셀값 f_min = src . min () # 최소픽셀값 nframe = img . astype ( ‘int64’ ) dst = np . clip ((( nframe – f_min ) / ( f_max – f_min )) * 255 , 0 , 255 ). astype ( ‘uint8’ ) hist = cv2 . calcHist ([ dst ],[ 0 ], None ,[ 256 ],[ 0 , 256 ]) plt . subplot ( 2 , 1 , 1 ), plt . imshow ( dst ) plt . subplot ( 2 , 1 , 2 ), plt . plot ( hist , color = ‘r’ ) plt . xlim ([ 0 , 256 ]) plt . show ()

히스토그램 평활화 (histogram equalization)

히스토그램 스트레칭은 분포도를 넓혀주지만 특정 그레이스케일 값에 픽셀 분포가 너무 뭉쳐있는 경우 이를 평준화 해주지는 않는다. 히스토그램 평활화는 그래프에서 너무 돌출되는 부분을 깎아주어 평준화해준다.

이는 다음 수식을 사용한다.

** dst ( x , y ) = round (( 누적합 ( src ( x , y )) * 픽셀최대값 ) / 픽셀누적최대값 – 최소값 ) **

그리고 수식을 코드로 구현할 경우 다음과 같다.

hist , bins = np . histogram ( src . flatten (), 256 ,[ 0 , 255 ]) cdf = hist . cumsum () # 누적합. 각 빈의 누적합 계산 cdf_m = np . ma . masked_equal ( cdf , 0 ) # 속도개선을 위해 0인 부분 제외 #히스토그램 평활화 cdf_m = ( cdf_m – cdf_m . min ()) * 255 / ( cdf_m . max () – cdf_m . min ()) # Mask처리를 했던 부분을 다시 0으로 변환 cdf = np . ma . filled ( cdf_m , 0 ). astype ( ‘uint8’ ) dst = cdf [ src ] # src의 값이 cdf배열의 인덱스로 사용됨 # cdf는 히스토그램 평활화된 값이 저장되어 있으므로 # src[12][10]칸의 픽셀값이 125이면 cdf[125]의 값을 추출 # 이 값은 픽셀값 125가 평활화된 값이다 hist = cv2 . calcHist ([ dst ],[ 0 ], None ,[ 256 ],[ 0 , 256 ]) # 결과

하지만 히스토그램 스트레칭과는 다르게 평활화는 별도 함수가 존재하므로 매번 위 코드를 작성하지 않아도 된다! 히스토그램 평활화 함수는 cv2.equalizeHist()

영상의 명암비(Contrast) 조절

728×90

반응형

명암비(Contrast)란?

밝은 곳과 어두운 곳 사이에 드러나 는 밝기 정도의 차이이다.

컨트라스트, 대비라고 도 한다.

dst(x, y) = saturate(s * src(s, y)) #s 라는 scaling factor 를 사용하여 곱셈을 한다.

s = 0.5 일 때 명암비는 낮아지는 대신 어두워진다. s = 2.0 일 때는 (y = 2x) 픽셀의 값이 255 이상 넘어가는 값이 많아 하얀 이미지로 보이는 문제가 발생한다.

효과적인 명암비 조절 함수

dst(x, y) = saturate(src(s, y) + src(x,y) – 128 * a) #a 파는 기울기의 역할을 한다(문턱치)

contrast1.py

import sys import numpy as np import cv2 src = cv2.imread(‘lenna.bmp’, cv2.IMREAD_GRAYSCALE) if src is None: print(‘Image load failed!’) sys.exit() alpha = 1.0 dst = np.clip((1+alpha)*src – 128*alpha, 0, 255).astype(np.uint8) cv2.imshow(‘src’, src) cv2.imshow(‘dst’, dst) cv2.waitKey() cv2.destroyAllWindows()

728×90

반응형

파이썬 openCV 5. 명암대비 스트레칭(streching)

반응형

파이썬 openCV 5번째 강의는 명암대비 스트레칭입니다.

여러분들도 근육이 뭉쳤을때 스트레칭을 통해 근육을 풀어주곤 하죠? 이미지도 마찬가지로 스트레칭이 가능한데요. 이번 시간에 스트레칭중 명암대비 스트레칭 기법을 알려드리겠습니다.

0. 스트레칭?

사람은 스트레칭을 할 때 근육을 쭉 늘리면서 스트레칭을 하죠? 이미지의 스트레칭은 이미지의 명암(밝고 어두움)을 쭈욱 늘려서 명암의 분포를 넓게 만드는 작업을 말합니다. 스트레칭의 방법으로는 명암대비 스트레칭과 엔드-인 기법의 두가지 방식이 대표적이며, 이번 시간에는 명암대비 스트레칭에 대해서 알려드리려고 합니다.

스트레칭을 알기 전에 히스토그램을 먼저 설명을 하고 가야되는데요. 히스토그램은 원래 도수분포표를 그래프의 형태로 나타낸 것을 말합니다.

출처 : 위키백과

위 사진이 대표적인 히스토그램의 모습입니다. 히스토그램의 자세한 정보는 통계학 과목을 공부하다 보면 알 수 있으니 패스하고, 우리는 디지털 영상에서의 히스토그램을 살펴 보겠습니다.

디지털 영상에서의 히스토그램은 특정한 값을 가진 화소가 영상 안에 몇 개나 있는지를 표시한 것입니다. 특정한 값은 그레이스케일(흑백)이라면 밝기에 해당하는 명도값을, 일반적인 컬러 영상이라면 각각의 RGB값을 히스토그램으로 나타 낼 수 있겠죠.

이런 히스토그램으로 나타냈을때 좋은점이 여러가지 있습니다. 그중 첫번째로 화소값이 어떻게 되어있는지가 한번에 보이점이 있죠. 명도값을 히스토그램으로 나타냈을때 0쪽에 대부분 있다면 어두운영상, 255쪽에 대부분 있다면 밝은 영상, 히스토그램이 전체적으로 왼쪽에 있다면 명암대비가 낮은 영상, 히스토그램이 전체적으로 고르게 분포해 있다면 명암대비가 높은 영상입니다.

여기서 명암대비 스트레칭이 나오는데요. 명암대비가 낮은 영상을 명암대비가 높은 영상으로 늘려주는것을 명암대비 스트레칭이라고 하는거죠.

1. openCV에서의 명암대비 스트레칭

이제 히스토그램이 무엇인지도 알았고, 명암대비 스트레칭이 무엇인지도 알았으니 직접 해봐야겠죠?

명암대비 스트레칭을 하는 방법은 각각의 화소에 아래의 공식을 적용하면 됩니다

new pixel = (old pixel – low) * 255 / high – low

■ old pixel은 원래 영상 화소의 명도값

■ new pixel은 결과 영상 화소의 명도값(= 결과값)

■ low는 히스토그램의 최저 명도값

■ high는 히스토그램의 최고 명도값

이걸 모든 화소에 전부 적용해야하니 우리는 중첩 for문을 사용해서 적용해 보도록 하겠습니다.

시작하기 전에 이번에는 히스토그램과 관련된 강의이기 때문에 먼저 히스토그램을 표시할 수 있는 모듈이 필요합니다. 파이썬에서는 matplotlib라는 모듈이 히스토그램을 표시할 수 있는 모듈인데요. 파이썬을 설치하실때 기본 파이썬이 아닌 Anaconda로 설치하신 분들은 같이 동봉되어 있을테니 패스하셔도 되지만 해당 모듈이 없으신분들은 파이썬 콘솔을 켜고

>pip install matplotlib

라고 입력하셔서 matplotlib를 다운로드 하시면 될거같네요!

자 이제 matplotlib를 받으셨으면 import해야겠죠?

import matplotlib.pyplot as plt

잘보시면 matplotlib 전체를 import한 것이 아니라 matplotlib에 있는 pyplot만 import한 것을 볼 수 있는데요. 이는 우리가 사용할 대부분의 기능이 pyplot에서 사용하기에 pyplot만 사용하도록 import한 것입니다. 물론 대부분의 사용자들이 쓰는 plt로 치환해주는건 센스!

이제 명암대비 스트레칭을 시작해볼까요?

img = cv2.imread(“lenna.png”)

늘 그렇듯 먼저 이미지를 불러와 주시구요.

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

명암대비 스트레칭은 그레이스케일(흑백)으로 하기에 흑백이미지로 변환해줍니다.

out = gray.copy()

저장할 변수도 만들어줍니다.

height, width = gray.shape

저번 강의처럼 이미지의 크기를 불러와줍니다.

중첩 for문으로 명암대비 스트레칭 공식을 적용해야 하는데요. 해당 공식을 적용하기 전에 high값과 low값을 알아야합니다

high = gray.max()

low = gray.min()

max는 파이썬 자체에서 제공하는 최댓값을 찾아주는 코드입니다. min은 반대로 최솟값을 찾아주는 코드이지요. 그레이스케일로 된 이미지의 값들은 각각 화소의 명도를 나타냅니다. 그래서 max와 min으로 쉽게 최댓값과 최솟값을 알 수 있는거죠.

for i in range(width): for j in range(height): out[i][j] = (gray[i][j] – low) * 255 / (high – low)

위와 같은 중첩 for문을 사용해서 gray의 각각의 화소에 명암대비 스트레칭 공식을 적용하고 결과 값을 out에 저장합니다.

cv2.imshow(“original”, gray)

cv2.imshow(“streching”, out)

마지막으로 출력을 해주면 명암대비 스트레칭 작업은 끝입니다.

하지만 우리는 스트레칭이 잘됬는지 직접 봐야겠죠? 그때 이제 plt가 사용됩니다

plt.figure()

우선 plt.figure()라는 코드를 사용했습니다. 이건 히스토그램보기 전에 틀을 만들었다고 보시면 됩니다.

plt.subplot(1, 2, 1)

이제 plt에서 subplot(큰 틀 안에 작은 틀)을 만들어줍니다. 이번거는 1행 2열을 가지는 plt에서 1번째 칸에 subplot를 만들어준다는 뜻입니다

plt.hist(gray.ravel(), 256, [0, 256])

앞에서 부터 설명하겠습니다. hist는 히스토그램을 만드는 pyplot의 명령어입니다. hist는 hist(배열, x축의 갯수, y축의 값의 범위) 입니다. 이때 배열은 1차원 배열을 넣어주기 위해 ravel()을 사용하여 1차원 배열화 시켰습니다

plt.subplot(1, 2, 2)

plt.hist(out.ravel(), 256, [0, 256])

같은 방식으로 결과영상인 out도 히스토그램화 시켜서 1, 2의 자리에 넣어주겠습니다.

plt.show()

이제 결과를 보여주면!

원본영상 스트레칭한 영상

이 둘의 차이를 느끼실 수 있나요? 눈이 좋으신분들은 바로 느끼셨을테지만 크게 달라진건 없어보입니다. 그렇다면 이걸 히스토그램으로 본다면 어떻게 될까요?

왼쪽 : 원본 / 오른쪽 : 스트레칭

왼쪽에 비해서 오른쪽의 히스토그램이 좀더 넓게 분포되어있는것을 볼 수 있습니다. 이제 차이가 느껴지시나요?

2. 마치며

이번에는 전에 쓰지않던 matplotlib를 사용해서 설명이 조금 장황했을수도 있겠네요. 이 다음 강의인 엔드-인 기법 강의에서도 matplotlib를 사용할 예정이고, 여타 히스토그램과 관련된 강의를 쓴다면 그때도 matplotlib를 사용 할 예정이니 꼭 잊지마세요~

import cv2 import matplotlib.pyplot as plt img = cv2.imread(‘lenna.png’) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) out = gray.copy() height, width = gray.shape high = gray.max() low = gray.min() for i in range(width): for j in range(height): out[i][j] = ((gray[i][j] – low) * 255 / (high – low)) cv2.imshow(“original”, gray) cv2.imshow(‘streching’, out) plt.figure() plt.subplot(1, 2, 1) plt.hist(gray.ravel(), 256, [0, 256]) plt.subplot(1, 2, 2) plt.hist(out.ravel(), 256, [0, 256]) plt.show() cv2.waitKey(0)

반응형

히스토그램 스트레칭, 정규화(cv2.normalize)

반응형

황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.

영상의 명암비 조절

명암비(Contrast)는 밝은 곳과 어두운 곳 사이에 드러나는 밝기 정도의 차이를 의미합니다.

1. 기본적인 명암비 조절 – np.clip

그레이스케일의 픽셀값을 조정하여 명암비를 조절하는 법을 알아보겠습니다.

np.clip으로 saturate 연산을 구현하였고 아래의 방정식을 구현하였습니다.

[예제 코드]

src = cv2.Imread(‘lenna.bmp’, cv2.IMREAD_GRAYSCALE) if src is None: print(‘Image load failed!’) sys.exit() alpha = 1 # 기울기 dst = np.clip((1 + alpha) * src – 128 * alpha), 0, 255).astype(np.unit8) cv2.imshow(‘src’, src) cv2.imshwo(‘dst’, dst) cv2.waitKey() cv2.destroyAllWIndows()

alpha값을 변경해주면서 원하는 명암비를 설정해줄 수 있습니다.

[결과]

명암비가 변경되었습니다.

2. 영상의 자동 명암비 조절 – 정규화 함수(cv2.normalize)

OpenCV에서 cv2.normalize() 함수를 이용하면 히스토그램 스트레칭 기법을 구현할 수 있습니다.

히스토그램 스트레칭(Histogram stretching)

• 영상의 히스토그램이 그레이스케일 전 구간에서 걸쳐 나타나도록 변경하는 선형 변환 기법입니다.

[함수 설명]

cv2.normalize(src, dst, alpha=None, beta=None, norm_type=None, dtype=None, mask=None) -> dst

• src: 입력 영상

• dst: 결과 영상 (None 입력)

• alpha: (노름 정규화인 경우) 목표 노름 값, (원소 값 범위 정규화인 경우) 최솟값

• beta: (원소 값 범위 정규화인 경우) 최댓값

• norm_type: 정규화 타입. NORM_INF, NORM_L1, NORM_L2, NORM_MINMAX.

히스토그램 스트레칭은 NORM_MINMAX

• dtype: 결과 영상의 타입

• mask: 마스크 영상

[예제 코드]

src = cv2.imread(‘Hawkes.jpg’, cv2.IMREAD_GRAYSCALE) if src is None: print(‘Image load failed!’) sys.exit() dst = cv2.normalize(src, None, 0, 255, cv2.NORM_MINMAX) # 히스토그램 스트레칭은 NORM_MINMAX # 넘파이로 히스토그램 스트레칭 구현 gmin = np.min(src) gmax = np.max(src) dst = np.clip((src – gmin) * 255. / (gmax – gmin), 0, 255).astype(np.unit8)) cv2.imshow(‘src’, src) cv2.imshow(‘dst’, dst) cv2.waitKey() cv2.destroyAllWindows()

[결과]

히스토그램 스트레칭 적용

이처럼 히스토그램 스트레칭을 적용하면 명암비가 적절하게 조절됩니다.

반응형

[OpenCV] 밝기와 명암

1. Grayscale 영상 다루기

파일을 읽어올때 채널(channel) 차원을 1로해서 읽어와야 그레이스케일 영상을 받아올 수 있다.

그레이스케일을 입력받는 함수에 컬러 영상을 입력하면 에러가 발생해 프로그램이 종료 될 수 있다.

그래서 Mat::type()함수를 사용해서 원하는 입력값이 맞는지 확인해줘야 한다.

void func(Mat& img){ CV_Assert(img.type() == CV_8UC1); // … } // expr이 false이면 에러 발생 후 프로그램 종료 CV_Assert(expr); CV_DbgAssert(expr);

영상 밝기 증가

영상의 밝기를 증가 시킬때는 영상을 저장한 변수에 밝기 증가를 원하는 값을 더해주면 된다.

void brightness1(){ Mat src = imread(“lenna.bmp”, IMREAD_GRAYSCALE); if(src.empty()){ cerr << "File open error" << endl; return; } Mat dst = src + 100; imshow("src", src); imshow("dst", dst); waitKey(); destroyAllWindows(); } 위 함수를 실행하면 이렇게 나온다. opencv에서 제공하는 연산자를 사용하지 않고 직접 행렬의 값을 조작해서 바꿀 수도 있다. void brightness2() { Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); if(src.empty()){ cerr << "File Open Error" << endl; return; } Mat dst(src.rows, src.cols, src.type()); for(int i = 0; i < src.rows; ++i) for(int j = 0; j < src.cols; ++j) dst.at(i,j) = src.at(i,j) + 100; imshow(“src”, src); imshow(“dst”, dst); waitKey(); destroyAllWindows(); }

하지만 birghtness1과 같은 값이 나오지 않는다. 그 이유는 오버플로우 때문이다. uchar의 범위는 0~255까지인데 256을 대입하면 0이 되기 때문에 오버플로우가 발생하게 된다.

이러한 오버플로우 현상은 opencv에서 매우 빈번하게 발생한다. 그래서 opencv에서는 이를 방지해주는 함수를 지원한다.

dstType sturate_cast (srcType)를 사용하명 src를 dst에 맞게 마꿔준다.

트렉바를 이용해서 밝기 조절하기

이전에 트렉바를 사용해서 그레이스케일을 변경한 것처럼 영상의 밝기를 조절 할 수 있다.

void on_brightness(int pos, void* userdata); void brightness3() { Mat src = imread(“lenna.bmp”, IMREAD_GRAYSCALE); if(src.empty()){ cerr << "File Open Error" << endl; return ; } namedWindow("dst"); createTrackbar("Brightness", "dst", 0, 100, on_brightness, (void*)&src); on_brightness(0, (void*)&src); waitKey(); destroyAllWindows(); } void on_brightness(int pos, void* userdata) { Mat src = *(Mat*)userdata; Mat dst = src + pos; imshow("dst",dst); } 이때의 출력 결과이다. 영상의 명암비 조절 명암비란 연상에서 밝은 영역과 어두운 영역 사이에 드러나는 밝기 차이의 강도를 의미. contrast라고도 한다. 명암비를 조절할때는 주로 곱연산을 사용한다. 곱 연산은 큰값은 더 크게 만들 수 있으므로 큰 수를 곱함으로서 명암비를 늘릴 수 있다. 하지만 많이 곱하면 픽셀값이 포화가 되어 사물을 구분하기 어려워 진다. void contrast1() { Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); if(src.empty()){ cerr << "file open error" << endl; return ; } float s = 2.f; Mat dst = s * src; imshow("src", src); imshow("dst", dst); waitKey(); destroyAllWindows(); } 결과 효과적인 명암비 조절 명암비를 효과적으로 늘려줄려면 어두운 값은 더 어둡게 밝은 값은 더 밝게 해주어야한다. 그렇게 하기 위해서는 uchar최대값의 반 보다 작은 것들은 더 작게하고 큰 쪽은 더 크게 해주어야한다. void contrast2() { Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); if(src.empty()){ cerr << "file open error" << endl; return ; } float alpha = 1.f; Mat dst = src + (src -128) * alpha; imshow("src", src); imshow("dst", dst); waitKey(); destroyAllWindows(); } 결과 명암비가 높아져서 훨씬 사물을 구분하기 쉬워졌다. 심심해서 해봤다 나다. 반응형

openCV를 사용한 영상의 밝기와 명암비 조절

행렬의 덧셈과 뺄셈으로 간단하게 영상의 밝기 조절 가능

openCV에서 제공하는 영상의 밝기 조절 사용자가 직접 영상의 픽셀 값을 참조하여 밝기 조절 트랙바를 이용하여 실시간으로 밝기 조절

▶그레이스케일 영상

Why 그레이? ->과거에 개발되었던 많은 영상 처리 알고리즘이 주로 그레이스케일 영상을 대상으로! ->컬러영상의 경우 R,G,B로 이루어져 그레이 스케일보다 3배의 메모리와 연산시간이 필요

º 그레이스케일 형태의 Mat 객체를 생성하는 3가지 방법

①imread 두번째 인자에 IMREAD_GRAYSCALE

Mat img1 = imread(“lenna.bmp”, IMREAD_GRAYSCALE);

②cvtColor() 함수 사용

Mat img3 = imread(“minjin.bmp”, IMREAD_COLOR); Mat img4; cvtColor(img3, img4, COLOR_BGR2GRAY);

-Mat 객체에 저장된 색상 정보를 변경할 때 사용하는 함수

-전달인자: 입력 영상, 출력 영상, 컬러변환코드

③그레이스케일 영상을 저장할 새로운 Mat 객체 생성 -> CV_8UC1 타입 객체 생성

Mat img2(480, 640, CV_8UC1, Scalar(0));

▶openCV에서 제공하는 함수를 통해 영상의 밝기 조절

영상의 전체적인 밝기를 조절하여 좀 더 밝거나 어두운 영상을 만드는 작업

모든 픽셀에 양수의 값을 + -> 영상이 밝아짐, 양수의 값 – -> 영상이 어두워짐

영상의 밝기 조절을 수식으로 표현

dst(x,y) = src(x,y) + n

-dst = 출력영상, src = 입력영상, n = 양수(밝기↑), 음수(밝기↓)

※영상의 픽셀 값은 그레이스케일의 최대값인 255와 최솟값인 0으로 설정!

∴ 원소자료형이 가질 수 있는 값의 범위를 벗어나는 경우 해당 자료형의 최소/최대로 설정하는 연산인 포화(saturate)연산 사용!

dst(x,y) = saturate(src(x,y) + n);

▶영상의 밝기 조절 직접 구현

(openCV에서 제공하는 함수를 사용하지 않고 직접 구현하는 방법)

=>Mat 행렬의 원소값 참조 방법 사용

= 입력 영상의 모든 픽셀을 방문하면서 픽셀값에 일정한 상수를 더하거나 or 뺌

Mat dst(src.rows, src.cols, src.type());

입력 영상 src와 크기, 타입이 같은 결과 영상인 dst 생성

cf) 사용자가 직접 만들 수 있지만 dst 영상의 픽셀값을 참조하려고 하면 에러가 발생할 수 있음

dst.at(j,i) = src.at(j,i) + 100;

입력 영상에서 (i,j) 좌표에서의 픽셀 값에 100을 더하여 결과 영상의 픽셀값으로 설정

Mat::at() 함수의 첫번째 인자 = y축 좌표에 해당하는 j, 두 번째인자 = x축 좌표에 해당하는 i (즉, (j = y축 좌표, i = x축 좌표)

※ 포화 연산을 수행하지 않으면 밝은 픽셀 주변에서 급격하게 어두운 픽셀이 나타남 ※

why?

unsigned char a = 256; count << "a = " << a << end1; C/C++에서 unsigned char 자료형은 1바이트의 메모리 공간 사용 -> 0~255 정수값 사용 => 256 대입시 자동으로 0으로 변환되어 저장

즉, 위 코드를 실행 시 입력 영상의 픽셀에 100을 더하고 255보다 큰 픽셀은 오히려 0에 가까운 어두운 픽셀로 바뀜

그렇다면,

for (int j = 0; j < src.rows; j++){ for(int i = 0 i < src.cols; i++){ int v = src.at(j,i) + 100; dst.at(j,i) = v > 255 ? 255 : v < 0 ? 0 : v; } } 변수 v는 int로 선언하여 255보다 큰 변수 저장 가능 삼항 조건 연산자를 통해 조건에 맞지 않는다면 0-255 사이로 변환 But, OpenCV에서는 행렬의 자료형에 맞게끔 포화 연산을 수행하는 saturate_cast()라는 캐스팅 함수 지원! template<> inline uchar saturate_cast(int v);

<> 괄호 사이에 사용하는 자료형 명시

▶영상의 명암비 조절

명암비 = 영상에서 밝은 영역과 어두운 영역 사이에 드러나는 밝기 차이의 강도

전체 픽셀에 적절한 시루를 곱하는 곱셈 연산 사용

사용 명암비가 낮은 영상 = 객체 간의 구분이 잘 되지 않아 전반적으로 흐릿한 느낌

명암비가 높은 영상 = 사물의 구분이 잘 되며 선명한 느낌

dst(x,y) = saturate(s*src(x,y))

기본적인 명암비 조절 수식

상수 s = 0보다 큰 양의 실수 => 255보다 큰 경우가 발생할 수 있으므로 포화 연산도 함께 사용

But, 영상이 전반적으로 어두워지거나, 결과 영상의 밝기가 너무 쉽게 포화되는 단점

▶효과적인 명암비 조절 방법

명암비를 효과적으로 높이기 위해 => 밝은 픽셀은 더욱 밝게, 어두운 픽셀은 더욱 어둡게!

픽셀의 밝고 어두움의 기준은? 그레이스케일 범위 중간값인 128을 기준으로 or 입력 영상으 평균 밝기

dst(x,y) = src(x,y) + (src(x,y) – 128)*α

▶히스토그램 분석

① 히스토그램 구하기

히스토그램(histogram) = 영상의 픽셀 값 분포를 그래프 형태로 표현

빈(bin) = 히스토그램에서의 가로축

-그레이스케일 영상의 경우 256개의 빈을 가지는 히스토그램을 구하는 것이 일반적

But! 히스토그램의 빈 개수가 항상 픽셀 값 범위와 같아야 하는 것은 아니다

히스토그램의 빈 개수가 줄어들면 히스토그램이 표현하는 영상의 픽셀 값 분포 모양이 좀 더 대략적인 형태로 바뀜

calcHist() = OpenCV에서 영상의 히스토그램을 구하는 함수

void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate = false);

-모두 10개인 인자, uniform과 accumulate의 경우 기본값(true, false)을 가지고 있으므로 최소 8개의 인자 설정

② 히스토그램 스트레칭

영상의 히스토그램이 그레이스케일 전 구간에 걸쳐서 나타나도록 변경하는 선형 변환 기법

명암비가 낮은 영상의 경우 히스토그램이 특정 구간에 집중 -> 이러한 히스토그램을 펼쳐서 히스토그램 그래프가 그레이스케일 전 구간에서 나타나도록 변환하는 기법

히스토그램 스트레칭을 수행한 영상은 명암비가 높아지기 때문에 대체로 보기 좋게 바뀜

히스토그램 스트레칭

③ 히스토그램 평활화

영상의 픽셀 값 분포가 그레이스케일 전체 영역에서 골고루 나타나도록 변경하는 알고리즘 = 픽셀 값 분포 조절

equalizeHist() = 그레이스케일 영상의 히스토그램 평활화를 수행하는 함수

void equalizeHist(InputArray src, OutputArray dst);

키워드에 대한 정보 opencv 명암 대비

다음은 Bing에서 opencv 명암 대비 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 파이썬 코딩 무료 강의 (활용편6) – OpenCV 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

파이썬 #코딩 #무료 #강의 #(활용편6) #- #OpenCV #이미지 #처리, #얼굴 #인식을 #통한 #캐릭터 #씌우기를 #해보아요


YouTube에서 opencv 명암 대비 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 파이썬 코딩 무료 강의 (활용편6) – OpenCV 이미지 처리, 얼굴 인식을 통한 캐릭터 씌우기를 해보아요 | opencv 명암 대비, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment