이미지와 영상을 받게되고 이 부분에 대해서 영상처리를 하려면 잘 보이게끔, 활용할 수 있도록 전처리를 해야합니다.
그래서 open cv2에 있는 함수들을 사용할 수 있습니다.
이번에는 뿌연사진을 참고해서 좀색이 진하고 뚜렷하게 볼 수 있도록 만들어보려고합니다.
균등화, 평탄화(Equalization)
- 히스토그램을 활용하여 이미지의 품질을 개선하기 위한 방법
- 화소값을 0 ~ 255 사이에 고르게 분포하도록 개선
- 사용되는 함수: cv2.equalizeHist()
2.색공간
YCbCr,
- 색 공간을 밝기 정보로 표현하는 방식
- Y: 밝기 정보
HSV
- 색을 표현하는 방법이자 색을 배치하는 방식
- H(색상, 빨강녹색파랑) , S(채도, 선명도), V(명도, 빛의 밝기)의 좌표를
색으로 지정
3. CLAHE(클라히)(Contrast Limited Adaptive Histogram Equalization)
- 평탄화를 하면 이미지의 밝은 부분이 날라가는 현상이 생길 수 있음
- 이미지의 일정한 영역을 나누어 평탄화를 적용
- 객체 = cv2.createCLAHE() => 객체.apply(영상)
4.정규화(normalization)
- 특정 영역에 값이 몰려있는 경우 화질을 개선하고,이미지 간의 연산 시 서로 조건이 다른경우 같은 조건으로 변경
- cv2.normalize()
cv2.NORM_MINMAX: 최소값과 최대값을 0 ~ 255로 변경(가장 많이 사용됨)
cv2.NORM_L1: 전체 합으로 나누어 정규화
cv2.NORM_L2: 단위 벡터로 정규화(제곱합의 루트로 나누어 정규화)
cv2.NORM_INF: 최대값으로 나누어 정규화
5. 색상 추출
- 영상에서 지정된 범위 안에 픽셀을 선택
- cv2.inRange()
BGR에서 녹색계열
0 <= B <= 100
128 <= G <= 255
0 <= R <= 100
HSV에서의 녹색계열
#색상
50 <= H <= 80
#채도
150 <= S <= 255
#명도(밝기정보)
0 <= V <= 255
6. 마스크 연산 (누끼따기)
- 마스크 연산을 지원하는 픽셀 값 복사 함수
- cv2.copyTo()
# equalize1
이번에는 눈앞이 뿌연 사진을 하나 가지고 왔습니다.
위 이미지의 샘플사진을 가지고 평탄화 하는 작업을 하려고 합니다.
정규화는(Normalization)으로 값의 범위를 조정하는것이고
히스토그램 평탄화(Equalization)은 밝기 분포르르고르게 만들어서 명암비를 개선하는것이에요/.
결국엔 픽셀값들이 고르게 분포되도록 조정해서 이미지의 명암(contrast)를 개선하는 작업입니다.
import cv2
import matplotlib.pyplot as plt
#gray로 불러온 이미지
img = cv2.imread('./Hawkes.jpg', cv2.IMREAD_GRAYSCALE)
#평탄화 된 이미지
dst = cv2.equalizeHist(img)
hist1 = cv2.calcHist([img], [0], None, [256], [0,255])
hist2 = cv2.calcHist([dst], [0], None, [256], [0,255])
cv2.imshow('img', img)
cv2.imshow('dst', dst)
hists = {'hist1': hist1, 'hist2': hist2}
plt.figure(figsize=(5, 9))
for i, (k, v) in enumerate(hists.items()):
plt.subplot(1,2,i+1)
plt.title(k)
plt.plot(v)
plt.show()
cv2.waitKey()
이미지를 가져오고 각각 원본이미지 [img]와 히스토그램 평탄화를 거친 이미지[dst]를 거치게 됩니다.
여기서 각각 파라미터의 역할에 대해서 조금 더 자세히 짚고 넘어가면
[0]
grayscale(흑백)이미지는 채널이 하나뿐이므로 0번 채널을 사용합니다.
컬러(RGB)는 세 가지 채널이 있습니다.
0 | BLUE채널 |
1 | Green채널 |
2 | Red채널 |
만약 컬러 이미지에서 특정 채널의 히스토그램을 계산하고싶으면 해당 채널 번호를 지정하면 됩니다.
특정 채널의 histogram을 계산할 일이 뭐가있고 어떨때 계산을 하는지가 궁금해지더라구요
그래서 알아보니
이미지의 각 채널별로 명암비, 밝기 분포를 분석해서 색상이나 조명의 문제를 해결할때쓰입니다.
예를들어서 너무 특정 색상이 강하거나 약한경우에 사용할 수 있고
예를들어 blue 채널[0]을 보면 픽셀값이 특정 범위에 몰려있는지 알 수 있고 이르 바탕으로 파랑색의 강도를 줄이는 작업을 할 수 있습니다.
또한 명암비를 조절, 특정색상 영역 분석 (특정색 구분하기) 등에도 사용가능합니다.
그래서 지금 위의 이미지에서도 적용한다고 볼 수 있습니다.
None: 마스크
일부 영역만 선택해서 계산하고 싶을때 사용하면 됩니다.
지금은 이미지 전체 대상으로 계산하니까 None을 넣습니다.
[256] : 히스토그램 빈(bin)개수
이렇게 구간(bin)을 세밀하게 나누면 더 정확한 밝기나 색상 정보를 얻을 수 있고, 구간을 크게 나누면 대략적인 경향을 파악할 수 있어요. 히스토그램 모양 자체는 픽셀 값의 분포에 따라 비슷하게 보일 수 있지만, 세부적인 차이는 각 구간(bin)의 크기에서 나타나게 됩니다.
[0~255]
픽셀 값 범위: 어떤 범위의 픽셀 값에 대해 히스토그램을 계산할지 설정 (일반적으로 0~255).를 작성합니다.
이후 hists로 딕셔너리로 만들어준 이유는 아래에서 for문을 돌 때 좀 더 편하게 사용하고 여러개를 관리하기 위함입니다.
항상 subplot은 그래프같아서 머리속에서 헷갈렸는데
언제 subplot을 사용하냐:
- 여러 개의 그래프를 나란히 비교하거나, 같은 창 안에서 다른 데이터나 변수를 시각화하고 싶을 때 사용해요.
- 예를 들어, 2개의 히스토그램을 나란히 비교하고 싶을 때, subplot을 사용해 2개의 그래프를 한 번에 그려서 비교할 수 있죠.
결국엔 2가지의 그래프를 한번에 그려서 비교할 수 있는것이라고 외우려고 합니다!.
그래서
plt.plot(v)는 y의 값을 의미하고
- y 값은 반드시 필요하며, x 값은 제공하지 않으면 자동으로 0, 1, 2, ...로 설정됩니다.
- **plt.plot(y)**에서 y 값이 기본적으로 필수 파라미터고, x 값은 선택적으로 사용할 수 있습니다.
그에 대한 결과는
이렇게 이미지가 평탄화 된 것을 확인 할 수 있고
1번 그림에 너무 많이 치중되어있었기에 평탄화 작업을 통해서 2번처럼 만들어주었습니다.
'AI 컴퓨터 비전프로젝트' 카테고리의 다른 글
[DL] 균등화, 평탄화단점보완 CLAHE(이미지, 영상 품질관련)(3) (0) | 2024.09.28 |
---|---|
[DL] 균등화, 평탄화 등 이미지 변환 활용(이미지, 영상 품질관련)(2) (1) | 2024.09.27 |
[DL] YOLO의 흐름 확인하기 좋은 복습 글 (3) | 2024.09.27 |
[ML/DL] 파이토치로 구현한 논리회귀 (5) | 2024.07.23 |
[ML] kMeans_비지도학습, 마케팅데이터셋 활용 (1) | 2024.07.16 |