打开一幅彩色图像,从图像数据中读取红、绿、蓝 三个分量,把图像变换到 HSI 空间,修改其中一个分量的值, 然后再变换回 RGB,显示比较原图像和改变后图像的差别。c++
时间: 2024-03-20 19:43:01 浏览: 48
好的,这是一个需要使用OpenCV库的问题,我会给出C++的代码实现。
首先,需要读入一幅彩色图像,可以使用OpenCV中的imread函数:
```c++
cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
```
接下来,需要将图像转换到HSI空间,可以使用OpenCV中的cvtColor函数:
```c++
cv::Mat img_hsi;
cv::cvtColor(img, img_hsi, cv::COLOR_BGR2HSV);
```
这里使用的是HSV空间,因为OpenCV中没有直接提供HSI空间的转换函数。HSV和HSI的区别不大,可以将这里的HSV当做HSI来使用。
然后,可以修改其中一个分量的值,比如将色相H增加30:
```c++
int h_shift = 30;
for (int row = 0; row < img_hsi.rows; row++) {
for (int col = 0; col < img_hsi.cols; col++) {
cv::Vec3b& hsi = img_hsi.at<cv::Vec3b>(row, col);
hsi[0] = (hsi[0] + h_shift) % 180; // 色相H的取值范围是0~179
}
}
```
最后,将图像转换回RGB空间,并显示比较原图像和改变后图像的差别:
```c++
cv::Mat img_rgb;
cv::cvtColor(img_hsi, img_rgb, cv::COLOR_HSV2BGR);
cv::Mat diff = img_rgb - img;
cv::imshow("Original Image", img);
cv::imshow("Modified Image", img_rgb);
cv::imshow("Difference", diff);
cv::waitKey(0);
```
完整的代码实现如下:
```c++
#include <opencv2/opencv.hpp>
int main() {
cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
cv::Mat img_hsi;
cv::cvtColor(img, img_hsi, cv::COLOR_BGR2HSV);
int h_shift = 30;
for (int row = 0; row < img_hsi.rows; row++) {
for (int col = 0; col < img_hsi.cols; col++) {
cv::Vec3b& hsi = img_hsi.at<cv::Vec3b>(row, col);
hsi[0] = (hsi[0] + h_shift) % 180;
}
}
cv::Mat img_rgb;
cv::cvtColor(img_hsi, img_rgb, cv::COLOR_HSV2BGR);
cv::Mat diff = img_rgb - img;
cv::imshow("Original Image", img);
cv::imshow("Modified Image", img_rgb);
cv::imshow("Difference", diff);
cv::waitKey(0);
return 0;
}
```
阅读全文