画图片归一化直方图的代码
时间: 2023-11-28 08:45:07 浏览: 116
根据提供的引用,以下是画图片归一化直方图的Python代码:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取灰度图像
img = cv2.imread('image.jpg', 0)
# 计算直方图
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
# 计算累积分布函数
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()
# 画直方图
plt.plot(cdf_normalized, color='b')
plt.hist(img.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper left')
plt.show()
```
其中,`cv2.imread('image.jpg', 0)`用于读取灰度图像,`np.histogram()`用于计算直方图,`hist.cumsum()`用于计算累积分布函数,`plt.plot()`和`plt.hist()`用于画直方图。
相关问题
vs窗体点击button进行直方图对比
要实现vs窗体点击button进行直方图对比,你可以按照以下步骤进行操作:
1. 创建两个PictureBox控件,一个用于显示原始图片,一个用于显示直方图。
2. 创建一个Button控件,用于触发直方图对比操作。
3. 在Button的Click事件中,先分别读取两张图片的像素信息,并计算出它们的直方图。
4. 然后将两个直方图绘制到PictureBox中,以供用户进行对比。
具体实现的代码可以参考以下示例:
```csharp
private void btnCompare_Click(object sender, EventArgs e)
{
// 读取两张图片的像素信息
Bitmap bmp1 = new Bitmap("image1.jpg");
Bitmap bmp2 = new Bitmap("image2.jpg");
// 计算两张图片的直方图
int[] hist1 = new int[256];
int[] hist2 = new int[256];
for (int i = 0; i < bmp1.Width; i++)
{
for (int j = 0; j < bmp1.Height; j++)
{
Color color1 = bmp1.GetPixel(i, j);
hist1[color1.R]++;
Color color2 = bmp2.GetPixel(i, j);
hist2[color2.R]++;
}
}
// 绘制直方图
DrawHistogram(pictureBox1, hist1);
DrawHistogram(pictureBox2, hist2);
}
private void DrawHistogram(PictureBox pictureBox, int[] hist)
{
// 创建画布
Bitmap bmp = new Bitmap(pictureBox.Width, pictureBox.Height);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);
// 找到最大的直方图值
int maxHist = 0;
for (int i = 0; i < 256; i++)
{
if (hist[i] > maxHist)
{
maxHist = hist[i];
}
}
// 绘制直方图
for (int i = 0; i < 256; i++)
{
int x = i * pictureBox.Width / 256;
int y = pictureBox.Height - hist[i] * pictureBox.Height / maxHist;
g.DrawLine(Pens.Black, x, pictureBox.Height, x, y);
}
// 显示直方图
pictureBox.Image = bmp;
}
```
注意,这只是一个简单的示例,实际上直方图对比还有很多细节需要考虑,例如直方图的归一化、颜色空间的选择等等。如果需要更加精确的直方图对比,你可能需要参考相关的图像处理算法和技术。
阅读全文