gpt4 book ai didi

c++ - 如何在 Opencv 中处理图像的特定部分

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:50 24 4
gpt4 key购买 nike

我使用 copyMakeBorder 在图像周围创建了一个 100x100x100x100 的边框。我想使用 cvtColor 仅将边框内的图像部分转换为灰色,因此边框仍然是 bgr,我不想使用 copyTo 来复制图像边框内的内容,我会喜欢就地处理图像。我查遍了谷歌,没有具体的代码示例可以做到这一点。请问有人提供代码示例吗?

最佳答案

Ed.S 的建议是正确的 - 在 opencv 中,您不能从较大的图像中获取一些 ROI 并将其从 rgb 转换为灰度而不是转换整个图像:

Mat src(1024, 768, CV_8UC3);
src.setTo(Scalar(255, 200, 100));

Mat roi = src(Rect(100, 100, 300, 300));
cvtColor(roi, roi, CV_RGB2GRAY); // nothing changed, still src is the same after cvtColor

你可以做的是在选定的roi中手动转换为灰度,不涉及复制,而是原地工作:

    Mat src(1024, 768, CV_8UC3);
src.setTo(cv::Scalar(255, 200, 100));

cv::imwrite("out.jpg", src);

Mat roi = src(cv::Rect(100, 100, 300, 300));

for(int i=0;i<roi.cols;i++)
for(int j=0;j<roi.rows;j++) {
cv::Vec3b p = roi.at<cv::Vec3b>(j,i);
unsigned char lumination = (unsigned char)( 0.2126*p[2] + 0.7152*p[1] + 0.0722*p[0]);
p[0] = p[1] = p [2] = lumination;
roi.at<cv::Vec3b>(j,i) = p;
}

编辑:这是一个 lena 示例:

Mat src = imread("lena.jpg");
Mat roi = src(cv::Rect(src.cols/4, src.cols/4, src.cols/2, src.rows/2));

for(int i=0;i<roi.cols;i++)
for(int j=0;j<roi.rows;j++) {
cv::Vec3b p = roi.at<cv::Vec3b>(j,i);
unsigned char lumination = (unsigned char)( 0.2126*p[2] + 0.7152*p[1] + 0.0722*p[0]);
p[0] = p[1] = p [2] = lumination;
roi.at<cv::Vec3b>(j,i) = p;
}
cv::imwrite("out.jpg", src);

结果:

enter image description here

关于c++ - 如何在 Opencv 中处理图像的特定部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23121807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com