You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

图像旋转是否改变灰度直方图?疑问及代码验证

图像旋转与灰度直方图的关系

你的理解完全正确——单纯的图像刚性旋转(无插值、像素裁剪或新增)不会改变灰度直方图,因为直方图统计的是图像中所有像素的灰度值分布,和像素的空间位置毫无关联。

课堂上提到的“旋转会改变直方图”,大概率指的是非直角倍数的任意角度旋转:这类旋转过程中,为了填充旋转后图像的空白区域,算法会对周边像素进行插值计算,生成新的灰度值;同时边缘部分的像素可能会被裁剪掉,这两种情况都会改变图像的灰度值集合,进而导致直方图变化。

而你用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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:35:33