Я пытаюсь выполнить выравнивание гистограммы в несколько шагов:
если это серый цвет, тогда я делаю расчет
если это RGB, я использую другие функции для преобразования его в раскраску YIQ, а затем выполняю вычисления на уровне Y, после чего преобразую его обратно в RGB.
Мне запрещено использовать любые функции lib, которые будут делать это, я должен сам сделать функцию выравнивания
Пока это выглядит так, как будто это работает для изображений серого цвета, но для RGB это дает мне испорченные результаты.
код:
def transformRGB2YIQ(imgRGB: np.ndarray) -> np.ndarray:
"""
Converts an RGB image to YIQ color space
:param imgRGB: An Image in RGB
:return: A YIQ in image color space
"""
yiq_from_rgb = np.array([[0.299, 0.587, 0.114],
[0.59590059, -0.27455667, -0.32134392],
[0.21153661, -0.52273617, 0.31119955]])
YIQ = np.dot(imgRGB.reshape(-1, 3), yiq_from_rgb).reshape(imgRGB.shape)
return YIQ
pass
def transformYIQ2RGB(imgYIQ: np.ndarray) -> np.ndarray:
"""
Converts an YIQ image to RGB color space
:param imgYIQ: An Image in YIQ
:return: A RGB in image color space
"""
yiq_from_rgb = np.array([[0.299, 0.587, 0.114],
[0.59590059, -0.27455667, -0.32134392],
[0.21153661, -0.52273617, 0.31119955]])
rgb_from_yiq = np.linalg.inv(yiq_from_rgb)
RGB = np.dot(imgYIQ.reshape(-1, 3), rgb_from_yiq).reshape(imgYIQ.shape)
return RGB
pass
def hsitogramEqualize(imgOrig: np.ndarray) -> (np.ndarray, np.ndarray, np.ndarray):
"""
Equalizes the histogram of an image
:param imgOrig: Original Histogram
:ret
"""
print(imgOrig.size)
if imgOrig.size == 540000:
img=imgOrig*255
histOrig, bins = np.histogram(img.flatten(), 256, [0, 256])
cdf = histOrig.cumsum()
cdf_m = np.ma.masked_equal(cdf, 0)
cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min())
cdf = np.ma.filled(cdf_m, 0).astype('uint8')
imgEq = cdf[img.astype('uint8')]
histEq, bins2 = np.histogram(imgEq.flatten(), 256, [0, 256])
else:
img=transformRGB2YIQ(imgOrig)*255
histOrig, bins = np.histogram(img[:, :, 0].flatten(), 256, [0, 256])
cdf = histOrig.cumsum()
cdf_m = np.ma.masked_equal(cdf, 0)
cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min())
cdf = np.ma.filled(cdf_m, 0).astype('uint8')
img[:, :, 0] = cdf[img[:, :, 0].astype('uint8')]
histEq, bins2 = np.histogram(img[:, :, 0].flatten(), 256, [0, 256])
imgEq=transformYIQ2RGB(imgOrig)
plt.imshow(imgEq)
plt.show()
return imgEq, histOrig, histEq
pass