1、 打开一幅彩色图像,从图像数据中读取红、绿、蓝 三个分量,把图像变换到 HSI 空间,修改其中一个分量的值, 然后再变换回 RGB,显示比较原图像和改变后图像的差别。 2、 打开一幅彩色图像,从图像数据中读取红、绿、蓝 三色,对三分量进行前面学习过的任何一种线性变换,然后输 出改变后的图像。 3、 打开彩色图像,对其进行变换到 HSI 空间,分别对 RGB 空间和 HIS 空间进行 7*7 中值滤波和拉普拉斯边缘增强 处理,比较两空间中处理结果的差异。 4、 打开一幅彩色图像,给定一颜色,对其进行色彩分 割,阈值自行给定。 5、 在第三题的基础上,给出一幅人像图像,在面部肤 色区域中使用交互的方式指定小块区域,计算均值为中心颜色, 计算方差为阈值实现人脸面部的分割。C++代码
时间: 2024-03-24 19:40:00 浏览: 97
当º≤H<º-彩色图像处理
以下是使用 OpenCV 库实现图像处理的 C++ 代码示例:
1. 图像 HSI 空间的变换与修改:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 打开彩色图像
Mat image = imread("sample.jpg");
if (image.empty())
{
cout << "无法打开图像文件!" << endl;
return -1;
}
// 转换到 HSI 空间
Mat hsi;
cvtColor(image, hsi, COLOR_BGR2HSV);
// 修改 H 分量的值
int channel = 0; // 0 表示 H 分量
int row = hsi.rows / 2; // 中心行
int col = hsi.cols / 2; // 中心列
hsi.at<Vec3b>(row, col)[channel] = (hsi.at<Vec3b>(row, col)[channel] + 90) % 180; // 修改为原值加 90
// 转换回 RGB 空间
Mat rgb;
cvtColor(hsi, rgb, COLOR_HSV2BGR);
// 显示原图像和改变后的图像的差别
imshow("Original Image", image);
imshow("Modified Image", rgb);
imshow("Difference", image - rgb);
waitKey(0);
return 0;
}
```
2. 对三分量进行线性变换:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 打开彩色图像
Mat image = imread("sample.jpg");
if (image.empty())
{
cout << "无法打开图像文件!" << endl;
return -1;
}
// 对三分量进行线性变换
Mat bgr[3];
split(image, bgr);
for (int i = 0; i < 3; i++)
{
bgr[i] = 2 * bgr[i] + 50; // 线性变换 y = 2x + 50
}
merge(bgr, 3, image);
// 显示改变后的图像
imshow("Modified Image", image);
waitKey(0);
return 0;
}
```
3. RGB 空间和 HSI 空间的中值滤波和拉普拉斯边缘增强处理:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 打开彩色图像
Mat image = imread("sample.jpg");
if (image.empty())
{
cout << "无法打开图像文件!" << endl;
return -1;
}
// RGB 空间中值滤波和拉普拉斯边缘增强
Mat rgb_median, rgb_laplace;
medianBlur(image, rgb_median, 7); // 7x7 中值滤波
Laplacian(rgb_median, rgb_laplace, CV_16S, 3, 1, 0, BORDER_DEFAULT); // 拉普拉斯边缘增强
convertScaleAbs(rgb_laplace, rgb_laplace);
// HSI 空间中值滤波和拉普拉斯边缘增强
Mat hsi;
cvtColor(image, hsi, COLOR_BGR2HSV);
Mat hsi_median, hsi_laplace;
medianBlur(hsi, hsi_median, 7);
Laplacian(hsi_median, hsi_laplace, CV_16S, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(hsi_laplace, hsi_laplace);
cvtColor(hsi_median, hsi_median, COLOR_HSV2BGR);
// 显示处理结果
imshow("RGB Median Filter", rgb_median);
imshow("RGB Laplacian Filter", rgb_laplace);
imshow("HSI Median Filter", hsi_median);
imshow("HSI Laplacian Filter", hsi_laplace);
waitKey(0);
return 0;
}
```
4. 图像色彩分割:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 打开彩色图像
Mat image = imread("sample.jpg");
if (image.empty())
{
cout << "无法打开图像文件!" << endl;
return -1;
}
// 指定颜色进行色彩分割
Scalar color(0, 0, 255); // 这里指定为红色
Mat mask;
inRange(image, color, color, mask);
// 显示分割结果
imshow("Color Segmentation", mask);
waitKey(0);
return 0;
}
```
5. 人脸分割:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 打开彩色图像
Mat image = imread("sample.jpg");
if (image.empty())
{
cout << "无法打开图像文件!" << endl;
return -1;
}
// 加载人脸分类器
CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_alt.xml");
// 检测人脸
vector<Rect> faces;
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
// 在人脸区域指定小块区域进行人脸分割
for (size_t i = 0; i < faces.size(); i++)
{
// 在人脸区域指定小块区域
int x = faces[i].x + faces[i].width / 2;
int y = faces[i].y + faces[i].height / 2;
Rect roi(x - 10, y - 10, 20, 20); // 这里指定为 20x20 大小的矩形
// 计算均值和方差
Scalar mean, stddev;
meanStdDev(image(roi), mean, stddev);
// 使用均值和方差进行二值化
Mat face_mask;
threshold(gray, face_mask, mean.val[0], 255, THRESH_BINARY);
// 显示分割结果
imshow("Face Segmentation", face_mask);
waitKey(0);
}
return 0;
}
```
请注意,这只是一个简单的示例,您需要根据您的实际需求进行适当修改。
阅读全文