qt中opencv怎么通过图像灰度分布画荧光图
时间: 2024-02-16 09:36:38 浏览: 83
Opencv给灰度图上色(基于RGB通道)
在Qt中使用OpenCV绘制荧光图可以按照以下步骤进行:
1. 加载图像并将其转换为灰度图像。
```C++
cv::Mat image = cv::imread("image.png");
cv::Mat grayImage;
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
```
2. 计算图像的灰度直方图。
```C++
cv::Mat histogram;
int histSize = 256; // 灰度级别数
float range[] = {0, 256};
const float* histRange = {range};
cv::calcHist(&grayImage, 1, nullptr, cv::Mat(), histogram, 1, &histSize, &histRange);
```
3. 将灰度直方图归一化。
```C++
cv::normalize(histogram, histogram, 0, 255, cv::NORM_MINMAX);
```
4. 创建一个黑色的荧光图像。
```C++
cv::Mat fluorescenceImage = cv::Mat::zeros(image.size(), CV_8UC3);
```
5. 为每个灰度级别绘制荧光曲线。
```C++
int binWidth = cvRound((double) fluorescenceImage.cols/histSize);
for (int i = 1; i < histSize; i++) {
cv::line(fluorescenceImage,
cv::Point(binWidth*(i-1), fluorescenceImage.rows - cvRound(histogram.at<float>(i-1))),
cv::Point(binWidth*(i), fluorescenceImage.rows - cvRound(histogram.at<float>(i))),
cv::Scalar(0, 255, 0), 1, cv::LINE_AA);
}
```
6. 可以将荧光图像显示出来。
```C++
cv::imshow("Fluorescence Image", fluorescenceImage);
cv::waitKey(0);
```
完整的代码如下:
```C++
cv::Mat image = cv::imread("image.png");
cv::Mat grayImage;
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
cv::Mat histogram;
int histSize = 256; // 灰度级别数
float range[] = {0, 256};
const float* histRange = {range};
cv::calcHist(&grayImage, 1, nullptr, cv::Mat(), histogram, 1, &histSize, &histRange);
cv::normalize(histogram, histogram, 0, 255, cv::NORM_MINMAX);
cv::Mat fluorescenceImage = cv::Mat::zeros(image.size(), CV_8UC3);
int binWidth = cvRound((double) fluorescenceImage.cols/histSize);
for (int i = 1; i < histSize; i++) {
cv::line(fluorescenceImage,
cv::Point(binWidth*(i-1), fluorescenceImage.rows - cvRound(histogram.at<float>(i-1))),
cv::Point(binWidth*(i), fluorescenceImage.rows - cvRound(histogram.at<float>(i))),
cv::Scalar(0, 255, 0), 1, cv::LINE_AA);
}
cv::imshow("Fluorescence Image", fluorescenceImage);
cv::waitKey(0);
```
阅读全文