数组索引必须为正整数或逻辑值。 出错 clahe (line 36) new_values = round(cdf(current_block+1) * (numel(cdf)-1));
时间: 2024-02-23 13:59:39 浏览: 23
这个错误的原因是 `current_block` 是一个矩阵,而在计算 `new_values` 时使用了 `current_block+1`,这会导致数组索引出现非正整数的情况。
要解决这个问题,可以将 `current_block` 转换为向量形式,再进行计算。可以使用 `(:)` 运算符将矩阵转换为列向量,代码如下:
```
% 将均衡化后的像素值写入结果图像
result(y_start:y_end, x_start:x_end) = reshape(new_values, [tile_size, tile_size]);
```
修改后的完整代码如下:
```
function [result] = clahe(input_image, clip_limit, tile_size)
% input_image: 输入图像
% clip_limit: 对比度限制因子(0-1),控制均衡化后像素值的范围
% tile_size: 块大小
% 将输入图像转换为灰度图像
if size(input_image, 3) == 3
input_image = rgb2gray(input_image);
end
% 计算图像大小
[height, width] = size(input_image);
% 计算图像中块的数量
num_tiles_x = floor(width / tile_size);
num_tiles_y = floor(height / tile_size);
% 初始化结果图像
result = zeros(height, width);
% 对每个块进行局部直方图均衡化
for i = 1:num_tiles_y
for j = 1:num_tiles_x
% 计算当前块的范围
x_start = (j - 1) * tile_size + 1;
x_end = j * tile_size;
y_start = (i - 1) * tile_size + 1;
y_end = i * tile_size;
% 获取当前块
current_block = input_image(y_start:y_end, x_start:x_end);
% 计算当前块的直方图
histogram = imhist(current_block);
% 计算当前块的累积分布函数,并进行均衡化
cdf = cumsum(histogram) / numel(current_block);
cdf = max(0, min(cdf, clip_limit));
cdf = (cdf - min(cdf(:))) / (1 - min(cdf(:)));
new_values = round(cdf(current_block(:)+1) * (numel(cdf)-1));
% 将均衡化后的像素值写入结果图像
result(y_start:y_end, x_start:x_end) = reshape(new_values, [tile_size, tile_size]);
end
end
% 将结果图像转换为 uint8 类型
result = uint8(result);
end
```