OpenCV 는 python 을 이용 하여 이미지 의 직사 도 균형 화 를 실현 한다.

1.직사 도
직사 도:(1)이미지 에 서로 다른 픽 셀 등급 이 나타 나 는 횟수(2)이미지 에 서로 다른 등급 의 픽 셀 이 총 픽 셀 수 에 대한 비율 을 가지 고 있 습 니 다.
우 리 는cv2.calcHist방법 을 사용 하여 직사 도 를 얻 었 다.cv2.calcHist(images, channels, mask, histSize, ranges):-img:그림
-channels:그림 의 채널 을 선택 하 십시오.
-histSize:직사 도 크기
-ranges:직사 도 범위
cv2.minMaxLoc:직사 도 의 최대 최소 값 과 그들의 색인 을 되 돌려 줍 니 다.

import cv2
import numpy as np
def ImageHist(image, type):
  color = (255, 255,255)
  windowName = 'Gray'
  if type == 1:    #         B-G-R
    color = (255, 0, 0)
    windowName = 'B hist'
  elif type == 2:
    color = (0,255,0)
    windowName = 'G hist'
  else:
    color = (0,0,255)
  #      
  hist = cv2.calcHist([image],[0],None,[256],[0,255])
  #          
  minV,maxV,minL,maxL = cv2.minMaxLoc(hist)
  histImg = np.zeros([256,256,3],np.uint8)
  #      
  for h in range(256):
    interNormal = int(hist[h] / maxV * 256)
    cv2.line(histImg, (h, 256), (h, 256 - interNormal), color)
  cv2.imshow(windowName, histImg)
  return histImg
img = cv2.imread('img.jpg', 1)
channels = cv2.split(img) # R-G-B
for i in range(3): 
  ImageHist(channels[i], 1 + i)
cv2.waitKey(0)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.직사 도 균형 화
회색 이미지 직사 도 균형 화
여기 서 우 리 는 직사 도 균형 화 된 이미 지 를 직접cv2.equalizeHist방법 으로 얻 을 수 있다.

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dat = cv2.equalizeHist(gray)
cv2.imshow('gray', gray)a
cv2.imshow('dat', dat)
cv2.waitKey(0)
원본 그림:
在这里插入图片描述
직사 도 균형 화 된 그림:
在这里插入图片描述
컬러 이미지 직사 도 균형 화
컬러 이미 지 는 3 개의 채널 이 있 습 니 다.직사 도 는 단일 채널 의 픽 셀 통 계 를 대상 으로 하기 때문에cv2.split방법 으로 이미지 의 색상 통 로 를 분리 하여 각 채널 의 직사 도 를 얻 고 마지막 으로cv2.merge()방법 으로 직사 도 를 합 쳐 컬러 이미지 의 직사 도 균형 화 를 얻 을 수 있 습 니 다.

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('img', img)
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
dat = cv2.merge((bH, gH, rH))
cv2.imshow('dat', dat)
cv2.waitKey(0)
D:\Anaconda\lib\site-packagesumpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
D:\Anaconda\lib\site-packagesumpy\.libs\libopenblas.NOIJJG62EMASZI6NYURL6JBKM4EVBGM7.gfortran-win_amd64.dll
D:\Anaconda\lib\site-packagesumpy\.libs\libopenblas.PYQHXLVVQ7VESDPUVUADXEVJOBGHJPAY.gfortran-win_amd64.dll
stacklevel=1)
원본 그림:
在这里插入图片描述
직사 도 균형 화 된 그림:
在这里插入图片描述
3.소스 코드 는 직사 도 균형 화 를 실현 한다.
다음은 소스 코드 로 직사 도 를 실현 하 겠 습 니 다.
가로 좌 표 는 픽 셀 등급 이 고 세로 좌 표 는 나타 날 확률 입 니 다.

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('img.jpg', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
count = np.zeros(256, np.float)
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    count[int(gray[i, j])] += 1 #           
count = count / (img.shape[0] * img.shape[1]) #     
x = np.linspace(0,255,256)
plt.bar(x, count,color = 'b')
plt.show()


#       

for i in range(1,256):
  count[i] += count[i - 1]
#   
map1 = count * 255
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    p = gray[i, j]
    gray[i, j] = map1[p]
cv2.imshow('gray', gray)
cv2.waitKey(0)
직사 각도:
在这里插入图片描述
직사 도 균형 화 된 그림:
在这里插入图片描述
컬러 직사 도 소스 코드

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('img.jpg', 1)
# R-G-B       
countb = np.zeros(256, np.float32)
countg = np.zeros(256, np.float32)
countr = np.zeros(256, np.float32)

for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    (b,g,r) = img[i,j]
    b = int(b)
    g = int(g)
    r = int(r)
    countb[b] += 1 #           
    countg[g] += 1
    countr[r] += 1
countb = countb / (img.shape[0] * img.shape[1]) #     
countg = countg / (img.shape[0] * img.shape[1])
countr = countr / (img.shape[0] * img.shape[1])
x = np.linspace(0,255,256)
plt.figure()
plt.bar(x, countb,color = 'b')
plt.figure()
plt.bar(x, countg,color = 'g')
plt.figure()
plt.bar(x, countr,color = 'r')
plt.show()


#          
for i in range(1,256):
  countb[i] += countb[i - 1]
  countg[i] += countg[i - 1]
  countr[i] += countr[i - 1]
#   
mapb = countb * 255
mapg = countg * 255
mapr = countr * 255

dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    (b,g,r) = img[i, j]
    dat[i, j] = (mapb[b],mapg[g],mapr[r])
cv2.imshow('dat', dat)
cv2.waitKey(0)

R-G-B 3 가지 색상 채널 의 직사 도 는 다음 과 같 습 니 다.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
그림 균형 화 된 결과:
在这里插入图片描述
OpenCV 가 python 을 이용 하여 이미지 의 직사 도 균형 화 를 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 OpenCV 직사 도 균형 화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기