对比度受限直方图均衡python实现
时间: 2024-01-04 16:03:59 浏览: 30
以下是Python实现对比度受限直方图均衡化的示例代码:
```python
import cv2
# 读取图像
img = cv2.imread('image.jpg', 0)
# 创建CLAHE对象
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# 应用CLAHE对象
cl1 = clahe.apply(img)
# 显示结果
cv2.imshow('original image', img)
cv2.imshow('CLAHE image', cl1)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上面的代码中,我们首先使用OpenCV的`imread()`函数读取图像。然后,我们创建一个CLAHE对象,并将其应用于原始图像。最后,我们使用`imshow()`函数显示原始图像和CLAHE图像。
CLAHE对象的`clipLimit`参数控制对比度限制,`tileGridSize`参数控制图像被分成的块的大小。
相关问题
写一个matlab基于直方图均衡、对比度受限的直方图均衡图像增强算法
好的,下面是基于直方图均衡、对比度受限的直方图均衡图像增强算法的MATLAB代码:
```matlab
function [enhanced_image] = hist_eq_clahe(image, clip_limit, tile_size)
% image: 原始图像
% clip_limit: 对比度受限的直方图均衡中的裁剪阈值
% tile_size: 对比度受限的直方图均衡中的块大小
% 将图像转换为灰度图像
if size(image, 3) == 3
image = rgb2gray(image);
end
% 直方图均衡
hist_eq_image = histeq(image);
% 对比度受限的直方图均衡
clahe_image = adapthisteq(image, 'ClipLimit', clip_limit, 'NumTiles', ...
[floor(size(image, 1)/tile_size), floor(size(image, 2)/tile_size)], ...
'TileSize', [tile_size, tile_size]);
% 将两种增强方法的结果加权融合(权重分别为0.5)
enhanced_image = 0.5 * hist_eq_image + 0.5 * clahe_image;
% 显示增强后的图像
imshow(enhanced_image);
end
```
这个函数接受三个参数:原始图像、对比度受限的直方图均衡中的裁剪阈值和块大小。函数首先将原始图像转换为灰度图像,然后对其进行直方图均衡和对比度受限的直方图均衡。最后,将两种增强方法的结果加权融合,并显示增强后的图像。
你可以调整clip_limit和tile_size参数来控制对比度受限的直方图均衡的效果。
用matlab写一段对比度受限的直方图均衡化代码
function [J] = CLAHE(I, numTiles, clipLimit)
% Contrast Limited Adaptive Histogram Equalization
% Input:
% I: input grayscale image
% numTiles: number of tiles to divide the image into
% clipLimit: optional clip limit (default is 0.01)
% Output:
% J: output equalized image
% Number of bins in the histogram
numBins = 256;
% Get image size
[M,N] = size(I);
% Compute tile size
tileSizeM = ceil(M/numTiles);
tileSizeN = ceil(N/numTiles);
% Compute clip limit
if nargin < 3
clipLimit = 0.01;
end
clipLimit = clipLimit*(tileSizeM*tileSizeN);
% Initialize histogram and output image
J = zeros(M,N);
histogram = zeros(numBins,1);
% Loop through tiles
for i = 1:numTiles
for j = 1:numTiles
% Compute tile boundaries
rowStart = (i-1)*tileSizeM + 1;
rowEnd = min(i*tileSizeM, M);
colStart = (j-1)*tileSizeN + 1;
colEnd = min(j*tileSizeN, N);
% Extract tile
tile = I(rowStart:rowEnd, colStart:colEnd);
% Compute histogram of tile
histogram(:) = 0;
for k = 1:numel(tile)
bin = tile(k) + 1;
histogram(bin) = histogram(bin) + 1;
end
% Clip histogram
excess = sum(histogram) - clipLimit;
if excess > 0
clipThreshold = excess/numBins;
for k = 1:numBins
if histogram(k) > clipThreshold
histogram(k) = clipThreshold;
end
end
end
% Compute cumulative histogram of tile
cumHistogram = zeros(numBins,1);
cumHistogram(1) = histogram(1);
for k = 2:numBins
cumHistogram(k) = cumHistogram(k-1) + histogram(k);
end
% Compute equalized tile
numPixels = numel(tile);
equalizedTile = zeros(size(tile));
for k = 1:numPixels
bin = tile(k) + 1;
equalizedTile(k) = floor((cumHistogram(bin)/numPixels)*(numBins-1));
end
% Assign equalized tile to output image
J(rowStart:rowEnd, colStart:colEnd) = equalizedTile;
end
end
% Convert output image to uint8
J = uint8(J);
end