灰度直方图统计和灰度直方图均衡化都不使用已知函数
时间: 2024-02-25 21:54:28 浏览: 27
对于灰度直方图统计,可以通过遍历图像的每个像素,统计每个灰度级别的像素数量,从而得到该图像的灰度直方图。具体实现可以使用数组或哈希表来记录每个灰度级别的像素数量。
而对于灰度直方图均衡化,可以通过以下步骤实现:
1. 计算图像的灰度直方图。
2. 计算每个灰度级别的累积概率分布函数(CDF)。
3. 将CDF映射到0到255之间的新灰度级别,得到灰度级别变换函数。
4. 对图像中的每个像素,使用灰度级别变换函数来映射其灰度级别,得到均衡化后的图像。
具体实现可以参考以下伪代码:
```
// 计算灰度直方图
histogram = new int[256]
for each pixel in image:
histogram[pixel]++
// 计算累积概率分布函数
cdf = new float[256]
sum = 0
for i from 0 to 255:
sum += histogram[i]
cdf[i] = sum / (image.width * image.height)
// 映射到新灰度级别
map = new int[256]
for i from 0 to 255:
map[i] = round(cdf[i] * 255)
// 映射像素灰度级别
for each pixel in image:
pixel = map[pixel]
```
通过上述步骤,可以实现灰度直方图均衡化,从而增强图像的对比度和视觉效果。
相关问题
灰度直方图统计和灰度直方图均衡化都不使用已知函数完整代码
以下是使用Python实现灰度直方图统计和灰度直方图均衡化的完整代码:
```python
import numpy as np
import cv2
# 灰度直方图统计
def histogram(image):
height, width = image.shape[:2]
hist = np.zeros((256,))
for i in range(height):
for j in range(width):
pixel = image[i, j]
hist[pixel] += 1
return hist
# 灰度直方图均衡化
def equalize(image):
height, width = image.shape[:2]
cdf = np.zeros((256,))
hist = histogram(image)
sum = 0
map = np.zeros((256,), dtype=np.uint8)
for i in range(256):
sum += hist[i]
cdf[i] = sum / (height * width)
for i in range(256):
map[i] = np.uint8(round(cdf[i] * 255))
result = np.zeros((height, width), dtype=np.uint8)
for i in range(height):
for j in range(width):
result[i, j] = map[image[i, j]]
return result
# 读取图像
image = cv2.imread('lena.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 统计直方图
hist = histogram(gray)
# 绘制直方图
hist_img = np.zeros((256, 256), dtype=np.uint8)
for i in range(256):
cv2.line(hist_img, (i, 255), (i, 255-int(hist[i]/100)), 255)
# 直方图均衡化
eq = equalize(gray)
# 显示结果
cv2.imshow('original', gray)
cv2.imshow('histogram', hist_img)
cv2.imshow('equalized', eq)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`histogram`函数用于统计灰度直方图,`equalize`函数用于实现灰度直方图均衡化,`cv2.imread`函数用于读取图像,`cv2.cvtColor`函数用于将图像转换为灰度图,`cv2.line`函数用于绘制直方图,`cv2.imshow`函数用于显示图像。
灰度直方图均衡化不使用已知函数
好的,以下是不使用已知函数完成灰度直方图均衡化的代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 读取图片并转为灰度图像
img = plt.imread("image.png")
gray = np.dot(img[...,:3], [0.299, 0.587, 0.114])
# 统计灰度直方图
hist = np.zeros((256,), dtype=int)
for i in range(gray.shape[0]):
for j in range(gray.shape[1]):
hist[int(gray[i,j])] += 1
# 计算累计分布函数
cdf = np.zeros((256,), dtype=float)
cdf[0] = hist[0] / (gray.shape[0] * gray.shape[1])
for i in range(1, 256):
cdf[i] = cdf[i-1] + hist[i] / (gray.shape[0] * gray.shape[1])
# 灰度直方图均衡化
equalized = np.zeros(gray.shape, dtype=int)
for i in range(gray.shape[0]):
for j in range(gray.shape[1]):
equalized[i,j] = int(cdf[int(gray[i,j])] * 255)
# 绘制均衡化后的图像和灰度直方图
x = np.arange(256)
plt.imshow(equalized, cmap='gray')
plt.show()
hist_eq = np.zeros((256,), dtype=int)
for i in range(equalized.shape[0]):
for j in range(equalized.shape[1]):
hist_eq[equalized[i,j]] += 1
plt.bar(x, hist_eq, width=1)
plt.show()
```
其中,与上面的代码实现相似,首先使用两个for循环遍历灰度图像的每个像素,根据每个像素的灰度值统计灰度直方图。接下来,计算灰度直方图的累计分布函数,再使用两个for循环遍历灰度图像的每个像素,根据累计分布函数将灰度值映射到[0, 255]的范围内,最终得到均衡化后的灰度图像。最后使用`plt.imshow`和`plt.bar`函数绘制均衡化后的图像和灰度直方图。