YUV422怎么转Mat,然后提取出mat中的Y值,提取出Y值图像后,计算Y值图像的平均亮度,然后计算每个像素点亮度值与图像平均亮度差值,若差值大于某一个阈值则记为一个坏点,把坏点坐标保存,并输出每个坏点的X,Y坐标
时间: 2023-12-01 16:03:37 浏览: 54
read_yuv.zip_YUV_read_yuv.m_video to yuv matlab_yuv 亮度_读取yuv
要将YUV422转换为Mat,可以使用OpenCV中的cv::cvtColor函数。具体实现代码如下:
```c++
// 假设yuv_data是输入的YUV422数据,width和height是图像的宽和高
cv::Mat yuv_mat(height * 3 / 2, width, CV_8UC1, yuv_data);
cv::Mat bgr_mat;
cv::cvtColor(yuv_mat, bgr_mat, cv::COLOR_YUV2BGR_YUYV);
// 提取Y值
cv::Mat y_mat(height, width, CV_8UC1);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
y_mat.at<uchar>(y, x) = bgr_mat.at<cv::Vec3b>(y, x)[0];
}
}
```
然后计算Y值图像的平均亮度可以使用cv::mean函数:
```c++
cv::Scalar mean_val = cv::mean(y_mat);
double avg_luminance = mean_val[0];
```
接下来计算每个像素点亮度值与图像平均亮度差值,若差值大于某一个阈值则记为一个坏点,把坏点坐标保存,并输出每个坏点的X,Y坐标,可以按照如下代码实现:
```c++
const double threshold = 30; // 阈值
std::vector<cv::Point> bad_points;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
double diff = std::abs(y_mat.at<uchar>(y, x) - avg_luminance);
if (diff > threshold) {
bad_points.emplace_back(x, y);
}
}
}
// 输出坏点坐标
for (const auto& p : bad_points) {
std::cout << "Bad point: (" << p.x << ", " << p.y << ")" << std::endl;
}
```
阅读全文