图像旋转是否改变灰度直方图?疑问及代码验证
图像旋转与灰度直方图的关系
你的理解完全正确——单纯的图像刚性旋转(无插值、像素裁剪或新增)不会改变灰度直方图,因为直方图统计的是图像中所有像素的灰度值分布,和像素的空间位置毫无关联。
课堂上提到的“旋转会改变直方图”,大概率指的是非直角倍数的任意角度旋转:这类旋转过程中,为了填充旋转后图像的空白区域,算法会对周边像素进行插值计算,生成新的灰度值;同时边缘部分的像素可能会被裁剪掉,这两种情况都会改变图像的灰度值集合,进而导致直方图变化。
而你用cv2.rotate执行的90度顺时针旋转属于刚性旋转:只是整体调换了像素的位置,没有新增或修改任何像素的灰度值,所有像素的灰度值和数量都和原图完全一致,自然直方图也完全相同。
附上你的验证代码(已格式化):
import cv2 import matplotlib.pyplot as plt import numpy as np import imageio img_input = cv2.imread('dog.png') img = cv2.cvtColor(img_input, cv2.COLOR_BGR2GRAY) fig, ax = plt.subplots(1, 2, figsize=(20, 10)) hist, bins = np.histogram(img, bins=255, density=True) # 显示图像与直方图 ax[0].set_title('输入图像') ax[0].imshow(img, cmap='gray') ax[1].set_title('直方图') ax[1].bar(bins[:-1], hist, width=0.05, edgecolor='k'); img_rotated= cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE) fig, ax = plt.subplots(1, 2, figsize=(20, 10)) hist_rot, bins_rot = np.histogram(img_rotated, bins=255, density=True) # 显示旋转后图像与直方图 ax[0].set_title('旋转后的输入图像') ax[0].imshow(img_rotated, cmap='gray') ax[1].set_title('直方图') ax[1].bar(bins[:-1], hist_rot, width=0.05, edgecolor='k');
总结:
- 直方图仅统计灰度值的出现频率,与像素空间位置无关
- 直角倍数的刚性旋转不改变像素灰度值集合,直方图完全一致
- 非直角旋转因插值、像素裁剪会改变灰度值分布,直方图才会产生变化
内容的提问来源于stack exchange,提问作者BB_
相关产品推荐
相关产品推荐

