如何在缩放图像后获得平滑的直方图?

Har*_*att 6 python opencv histogram

我正在尝试线性缩放图像,以便使用整个灰度范围。这是为了改善镜头的照明。然而,在绘制直方图时,我不知道如何获得缩放后的直方图,使其更平滑,从而成为离散箱所渴望的曲线。任何提示或要点将不胜感激。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img = cv.imread(r'/Users/harold/Documents/Academia/Nottingham Uni/Year 4/ImageProcessing/Imaging_Task_Sheet/PointImage.jpeg', cv.IMREAD_GRAYSCALE)

img_s = img/255
img_s = img_s / np.max(img_s)
img_s = img_s*255

histogram = cv.calcHist([img], [0], None, [256], [0, 256])
histogram1 = cv.calcHist([img_s.astype('uint8')], [0], None, [256], [0, 256])

plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")

plt.plot(histogram, label='Original Image')  # <- or here
plt.plot(histogram1, label='Equalised Image')  # <- or here
Run Code Online (Sandbox Code Playgroud)

生成的直方图为:

在此输入图像描述

出自这张图片:

在此输入图像描述

S_B*_*ier 3

我认为您想到的是一条穿过您的点的样条曲线。操作方法如下:

\n
import cv2 as cv\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nfrom scipy import interpolate\n\nimg = cv.imread(r\'3NKTJ.jpg\', cv.IMREAD_GRAYSCALE)\n\nimg_s = img/255\nimg_s = img_s / np.max(img_s)\nimg_s = img_s*255\n\nhistogram = cv.calcHist([img], [0], None, [256], [0, 256])\nhistogram1 = cv.calcHist([img_s.astype(\'uint8\')], [0], None, [256], [0, 256])\n\nx=np.linspace(0,len(histogram1),len(histogram1)) # x: 0 --> 255 with step=1\n\nX=np.where(histogram1>0)[0] # extract bins with non-zero histogram1 values\nY=histogram1[X] # the corresponding Y values\n\nF=interpolate.splrep(X, Y)   # spline representation of (X,Y)\nYnew = interpolate.splev(x, F) # calculate interpolated Ynew\n\nplt.figure()\nplt.title("Grayscale Histogram")\nplt.xlabel("grayscale value")\nplt.ylabel("pixels")\n\nplt.plot(histogram, label=\'Original Image\')  # <- or here\nplt.plot(histogram1, label=\'Equalised Image\')  # <- or here\nplt.plot(x,Ynew, label=\'spline interpolation of Equalised Image\')\n
Run Code Online (Sandbox Code Playgroud)\n

结果如下:\n在此输入图像描述

\n

最好的问候,\nSt\xc3\xa9phane

\n