std::vector<cv::Mat> channels; cv::split(display_img, channels); // 将 RGB 格式的图像拆分为三个通道 cv::Mat y_image = channels[0]; // 提取 Y 通道 imwrite("Y.bmp", y_image);//保存图片 double meanY = cv::mean(y_image)[0]; cv::Mat diff_mat = y_image - cv::Scalar(meanY); //设置亮度阈值 string HotSpec; this->HelperGetProp("BrightSpec", HotSpec); float HotSpecValue = atof(HotSpec.c_str()); //标记坏点 cv::Mat bad_points = cv::Mat::zeros(y_image.size(), CV_8UC1); int k = 0; for (int i = 0; i < y_image.rows; i++) { for (int j = 0; j < y_image.cols; j++) { if (abs(diff_mat.at<uchar>(i, j)) > HotSpecValue) { bad_points.at<uchar>(i, j) = 255; k += 1; bad_pointsGroup.emplace_back(j, i); AddNGLog((boost::format("hotpixel X:%d,y:%d") % j %i).str()); } } } string SingleHotpixelNum; this->HelperGetProp("BrightSpec", SingleHotpixelNum); int SingleHotpixelValue = atoi(HotSpec.c_str()); if (k > SingleHotpixelValue) { AddNGLog("Bright NUM > threshould"); return false; }
时间: 2024-04-26 14:27:13 浏览: 97
这段代码是针对 RGB 格式图像中亮度异常点的检测和标记。首先,将 RGB 格式的图像拆分为三个通道,然后提取其中的 Y 通道。接着,计算 Y 通道的平均值,并将其减去该平均值,得到差分图像 diff_mat。在这之后,根据预设的亮度阈值 HotSpecValue,将差分图像中绝对值超过该阈值的像素点标记为坏点,即将 bad_points 矩阵中的对应像素设为 255。同时,还记录了坏点的位置信息,存入 bad_pointsGroup 容器中。最后,如果坏点的数量超过预设的阈值 SingleHotpixelValue,则认为图像存在过多的亮度异常点,函数返回 false,否则返回 true。
阅读全文