编写matlab/P党thon/C/C++程序,计算lena图像的灰度直方图并显示:用直方图均衡法增强该图像(不允许直接使用库函数或第三方的直方图计算的函数,可以调用直方图均衡法的函数)
时间: 2024-10-23 08:15:07 浏览: 43
Tantivy是受Apache Lucene启发并以Rust编写的全文本搜索引擎库-C/C++开发
首先,让我们分步骤讲解如何在MATLAB、Python、C++和C语言中分别计算和增强 Lena 图像的灰度直方图:
**MATLAB:**
```matlab
% 加载 Lena 图像
img = imread('Lena.png');
gray_img = rgb2gray(img);
% 计算直方图
histogram_data = imhist(gray_img, 256); % 灰度范围从0到255,共256个bin
% 显示原始直方图
figure;
bar(histogram_data);
xlabel('灰度值');
ylabel('频数');
% 直方图均衡化
enhanced_img = histeq(gray_img, histogram_data);
% 显示增强后的图像
imshow(enhanced_img);
```
**Python (OpenCV):**
```python
import cv2
import matplotlib.pyplot as plt
# 加载 Lena 图像
img = cv2.imread('Lena.jpg', cv2.IMREAD_GRAYSCALE)
# 计算直方图
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
# 显示直方图
plt.figure()
plt.bar(bins[:-1], hist)
plt.xlabel('灰度值')
plt.ylabel('频数')
# 直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced_img = clahe.apply(img)
# 显示增强后的图像
cv2.imshow('Enhanced Image', enhanced_img)
cv2.waitKey(0)
```
**C++ (OpenCV):**
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 加载 Lena 图像
Mat img = imread("Lena.jpg", IMREAD_GRAYSCALE);
// 分配直方图
int histogram[256] = {0};
// 计算直方图
for(int i = 0; i < img.rows * img.cols; ++i) {
histogram[img.at<uchar>(i)]++;
}
// 显示直方图(这里需要自定义绘制)
// ...
// 创建 CLAHE 对象进行直方图均衡化
Ptr<CLAHE> clahe = createCLAHE();
Mat enhanced_img;
clahe->apply(img, enhanced_img);
// 显示增强后的图像
imshow("Enhanced Image", enhanced_img);
waitKey();
return 0;
}
```
**C (OpenCV):**
```c
#include <stdio.h>
#include <opencv2/opencv.h>
// 自定义直方图绘制函数
void drawHistogram(unsigned char* hist, int bins) {
// ...
}
int main(int argc, const char **argv) {
IplImage* img = cvLoadImage("Lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);
int histogram[256] = {0};
cvCalcHist(&img, 1, NULL, &hist, 1, &bins, sizeof(histogram));
// 显示直方图
drawHistogram(histogram, bins);
// 创建 CLAHE 对象进行直方图均衡化
CvCLAHE* clahe = cvCreateCLAHE(2.0f, cvSize(8, 8));
IplImage* enhanced_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
cvEqualizeHist(img, enhanced_img, clahe);
// 显示增强后的图像
cvNamedWindow("Enhanced Image", WINDOW_NORMAL);
cvShowImage("Enhanced Image", enhanced_img);
cvWaitKey();
cvReleaseImage(&img);
cvReleaseImage(&enhanced_img);
cvDestroyWindow("Enhanced Image");
cvReleaseCLAHE(&clahe);
return 0;
}
```
在这个例子中,我展示了如何手动计算直方图,以及创建CLAMatch结构来应用直方图均衡化。你需要自己编写直方图绘制的函数,在每个平台上完成这个任务。
阅读全文