computer-vision histogram-esitleme-ve-clahe

Histogram

Histogram bir görseldeki piksel yogunluklarını gösteren grafiktir. Tek scale üzerinden yapılır yani ya ayrı ayrı r,g,b değerler üzerinden ya da gray dönüşümüyle bakılabilir. 0-255 arası yatay düzlemde hangi renkten ne kadar oldugunu dikeyde gösterir. Bu görselin renk dağılımı ve kontrast ve parlaklık değerleri ile ilgili bize fikir verir. Bazen bu değerler 'bin'lerle ifade edilir meselsa 0-255lik kısım 16'lık binlere bölünür ve o şekilde bir grafik oluşturulur.

OpenCV Linki

  pth:str = r"C:\Users\asus\rag0nn\EngReader\test_data\2.JPG"
  src = cv.imread(cv.samples.findFile(pth))
  if src is None:
      print('Could not open or find the image')
      exit(0)

  bgr_planes = cv.split(src)

  histSize = 256

  histRange = (0, 256) # the upper boundary is exclusive

  accumulate = False

  b_hist = cv.calcHist(bgr_planes, [0], None, [histSize], histRange, accumulate=accumulate)
  g_hist = cv.calcHist(bgr_planes, [1], None, [histSize], histRange, accumulate=accumulate)
  r_hist = cv.calcHist(bgr_planes, [2], None, [histSize], histRange, accumulate=accumulate)

  hist_w = 512
  hist_h = 400
  bin_w = int(round( hist_w/histSize ))

  histImage = np.zeros((hist_h, hist_w, 3), dtype=np.uint8)

  # bir pikseldeki yoğunluk çok yüksek olursa grafik taşabilir ya da kötü gönürür o yüzden 400'e kadar normalize ediyoruz.
  cv.normalize(b_hist, b_hist, alpha=0, beta=hist_h, norm_type=cv.NORM_MINMAX)
  cv.normalize(g_hist, g_hist, alpha=0, beta=hist_h, norm_type=cv.NORM_MINMAX)
  cv.normalize(r_hist, r_hist, alpha=0, beta=hist_h, norm_type=cv.NORM_MINMAX)

  for i in range(1, histSize):
      cv.line(histImage, ( bin_w*(i-1), hist_h - int(b_hist[i-1]) ),
              ( bin_w*(i), hist_h - int(b_hist[i]) ),
              ( 255, 0, 0), thickness=2)
      cv.line(histImage, ( bin_w*(i-1), hist_h - int(g_hist[i-1]) ),
              ( bin_w*(i), hist_h - int(g_hist[i]) ),
              ( 0, 255, 0), thickness=2)
      cv.line(histImage, ( bin_w*(i-1), hist_h - int(r_hist[i-1]) ),
              ( bin_w*(i), hist_h - int(r_hist[i]) ),
              ( 0, 0, 255), thickness=2)

  cv.imshow('Source image', src)
  cv.imshow('calcHist Demo', histImage)
  cv.waitKey()
  import numpy as np
  import cv2 as cv
  from matplotlib import pyplot as plt

  img = cv.imread('home.jpg')
  assert img is not None, "file could not be read, check with os.path.exists()"
  color = ('b','g','r')
  for i,col in enumerate(color):
      histr = cv.calcHist([img],[i],None,[256],[0,256])
      plt.plot(histr,color = col)
      plt.xlim([0,256])
  plt.show()
 

Histogram Eşitleme

Görseldeki değerleri daha çarpıcı ve dengeli haline getirme amacıyla görseldeki piksellerle biraz oynayarak bilgi açısından daha net görseller elde etmeye yarar. Direkt opencv üzerinden yapılabilir.

Histogram-Output

  import cv2

  img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)

  equalized = cv2.equalizeHist(img)

  cv2.imshow("Original", img)
  cv2.imshow("Histogram Equalized", equalized)
  cv2.waitKey(0)
  cv2.destroyAllWindows()


CLAHE ( Contrast Limited Adaptive Histogram Equalization)

Tüm görselde histograma bakmak yerine alt dilimlerde histogram eşitleme yapar sornasında bir bileear interpolating yöntemiyle aralardaki renk farklılıkalrını giderir.

Fonsksiyonda tilesize dilim boyutunu gösterir ve genelde 8,8 kullanılır. cl ise clip limitin üstüne çıkan bin'lerin kesilmesini eşikleyen değerdir.

Equalization

  import cv2

  img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)

  cl = 2.0  # clipLimit
  tile_size = (8, 8)

  clahe = cv2.createCLAHE(clipLimit=cl, tileGridSize=tile_size)
  cl1 = clahe.apply(img)

  cv2.imshow("Original", img)
  cv2.imshow("CLAHE", cl1)
  cv2.waitKey(0)
  cv2.destroyAllWindows()