编写程序求出I的直方图矩阵H h1 = zeros(1,256); [rows,cols] = size(I); for r =1:rows for c=1:rows k = I(r,c);
时间: 2024-09-28 10:17:34 浏览: 38
在编写程序时,为了计算图像I的直方图矩阵H,首先我们初始化一个全零矩阵h1,大小为1行256列,表示灰度值从0到255的概率分布。这里的256通常对应8位像素,因为大多数常见图像编码标准采用这个范围。
接下来,获取图像I的行数(rows)和列数(cols),然后使用双层循环遍历每一个像素点。对于每个像素位置(r, c),它的灰度值k存储在当前的I数组里。在循环内部,我们将k对应的值加一到h1矩阵相应的位置,这代表该灰度级出现的次数。通过这种方式,最终得到的h1矩阵每一行代表了I中特定灰度级的频率。
以下是这部分代码的伪代码形式:
```python
# 初始化直方图矩阵H
h1 = np.zeros((1, 256))
# 图像I的尺寸
rows, cols = get_image_size(I)
# 遍历图像的每个像素
for r in range(rows):
for c in range(cols):
# 获取当前像素的灰度值
k = I[r, c]
# 更新h1矩阵,将对应灰度级的计数值加一
h1[0, k] += 1
# 计算并返回直方图矩阵H
H = normalize(h1)
```
相关问题
img = imread('1.png'); img_gray = rgb2gray(img); % 指定窗口大小和步长 window_size = 15; step_size = 5; % 计算图像的局部直方图 [rows, cols] = size(img_gray); hist_local = zeros(rows, cols, 256); for i = 1:step_size:rows-window_size+1 for j = 1:step_size:cols-window_size+1 % 提取当前窗口内的像素值 window = img_gray(i:i+window_size-1, j:j+window_size-1); % 计算当前窗口内的直方图 hist_window = imhist(window, 256); % 将当前窗口内的直方图扩展为与窗口大小相同的矩阵 hist_window = kron(ones(window_size, window_size), hist_window); % 将当前窗口内的直方图保存到局部直方图中 hist_local(i:i+window_size-1, j:j+window_size-1, :) = hist_window; end end % 检查是否存在没有被赋值的位置 if any(hist_local(:) == 0) % 将没有被赋值的位置赋值为1 hist_local(hist_local == 0) = 1; end % 显示原始图像和局部直方图 figure; subplot(1,2,1), imshow(img_gray), title('原始图像'); subplot(1,2,2), imshow(histeq(hist_local)), title('局部直方图');
这段代码实现了对一幅灰度图像的局部直方图均衡化,具体步骤如下:
1. 读取图像,并将其转换为灰度图像。
```
img = imread('1.png');
img_gray = rgb2gray(img);
```
2. 指定均衡化窗口大小和步长。
```
window_size = 15;
step_size = 5;
```
3. 计算图像的局部直方图。
```
[rows, cols] = size(img_gray);
hist_local = zeros(rows, cols, 256);
for i = 1:step_size:rows-window_size+1
for j = 1:step_size:cols-window_size+1
% 提取当前窗口内的像素值
window = img_gray(i:i+window_size-1, j:j+window_size-1);
% 计算当前窗口内的直方图
hist_window = imhist(window, 256);
% 将当前窗口内的直方图扩展为与窗口大小相同的矩阵
hist_window = kron(ones(window_size, window_size), hist_window);
% 将当前窗口内的直方图保存到局部直方图中
hist_local(i:i+window_size-1, j:j+window_size-1, :) = hist_window;
end
end
```
4. 检查是否存在没有被赋值的位置,如果存在,将其赋值为1。
```
if any(hist_local(:) == 0)
% 将没有被赋值的位置赋值为1
hist_local(hist_local == 0) = 1;
end
```
5. 显示原始图像和局部直方图均衡化后的图像。
```
figure;
subplot(1,2,1), imshow(img_gray), title('原始图像');
subplot(1,2,2), imshow(histeq(hist_local)), title('局部直方图');
```
在这段代码中,局部直方图均衡化的关键是计算局部直方图。在每个窗口内,通过imhist函数计算窗口内像素值的直方图,然后将直方图扩展为与窗口大小相同的矩阵,最后将直方图保存到局部直方图中。最后,使用Matlab内置的histeq函数对局部直方图进行均衡化,得到均衡化后的图像。
阅读全文