如何将直方图应用于图像的各个部分并重新组合图像

How to apply histogram to the parts of an image and recompose the image again

如何将图像分割成部分,应用直方图均衡化,将部分图像合成并显示出来 我正在尝试想出一种将图像拆分为定义数量的部分的方法,这意味着图像被拆分为多个矩形,这些矩形在组合时形成整个图像。然后对我要应用直方图均衡化的每个部分。之后我希望能够从第一张图像中已经应用直方图均衡化的部分形成一个新图像

## so far I know how to apply the histogram equalization to the entire image    

import cv2
import numpy as np
from matplotlib import pyplot as plt
 
## load image
img = cv2.imread('/home/pi/Downloads/bear.bmp',0)
 
## equalize
equ = cv2.equalizeHist(img)

plt.subplot(111),plt.imshow(equ, cmap = "gray"),plt.title('Equalized')
plt.xticks([]), plt.yticks([])
plt.show()

既然你已经弄清楚了如何对图像进行直方图均衡化,那么剩下的问题就是将原始图像分割然后合并回去。

OpenCV 相当不错,它为您提供了感兴趣区域 (ROI) 的概念,它是图像的一部分(定义为矩形)。出于所有实际目的,ROI 充当图像,但如果您修改它,原始图像也会被修改。

因此,您必须提取您感兴趣的所有 ROI,并对它们应用直方图均衡化。合并是隐式处理的,因为 ROI 是图像本身的一部分。

查看 here and here 了解有关 ROI 的更多信息。

试试这个:

import cv2
import numpy as np

img = cv2.imread("1.jpg")
(h,w,c) = img.shape
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

parts = []
step_x = 3
step_y = 3
eqs = []
eq_img = np.zeros_like(gray_img)

for x in range(step_x):
    for y in range(step_y):
        xratio1 = x/step_x
        xratio2 = (x+1)/step_x
        yratio1 = y/step_y
        yratio2 = (y+1)/step_y
        part = gray_img[int(yratio1*h):int(yratio2*h),int(xratio1*w):int(xratio2*w)].copy()
        parts.append(part)

        cv2.imshow("x = {0}, y = {1}".format(x,y),part)

        eq = cv2.equalizeHist(part)
        eqs.append(eq)
        eq_img[int(yratio1*h):int(yratio2*h),int(xratio1*w):int(xratio2*w)] = eq

cv2.imshow("eq_img",eq_img)
cv2.waitKey(0)