使用C++和opencv。 有一张灰度图res,轮廓识别结果contours。对图做如下处理。 1、对每个轮廓,分别做从步骤2开始的处理。 2、找到轮廓中心。 3、从轮廓中心,间隔2°作射线(射线不用在res中画出),找到和轮廓的180个交点。 4、对每个交点做从步骤5开始的处理。 5、从交点出发,以中心点-交点方向为正方向,沿着正向和负向各寻找5各像素。 6、从步骤5中找出的10个像素点中,计算灰度值最大值和最小值的差值。 7、根据差值大小,使用applyColorMap函数对图像实现伪彩。要求差值越大颜色越红,差值越小颜色越蓝。

时间: 2024-02-27 20:53:22 浏览: 16
好的,让我来解答您的问题。 首先,我们需要使用OpenCV库和C++语言来实现您的要求。以下是大致的代码实现过程: ```cpp // 读取灰度图像 cv::Mat res = cv::imread("res.png", cv::IMREAD_GRAYSCALE); // 轮廓检测 std::vector<std::vector<cv::Point>> contours; cv::findContours(res, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 遍历每个轮廓 for (const auto& contour : contours) { // 找到轮廓中心 cv::Moments moments = cv::moments(contour); cv::Point center(moments.m10 / moments.m00, moments.m01 / moments.m00); // 计算每个交点的位置 std::vector<cv::Point> intersections; for (int i = 0; i < 180; i += 2) { double angle = i * CV_PI / 180.0; double cosAngle = std::cos(angle); double sinAngle = std::sin(angle); double maxDist = std::sqrt(std::pow(res.cols, 2) + std::pow(res.rows, 2)); cv::Point endpoint(center.x + maxDist * cosAngle, center.y + maxDist * sinAngle); cv::Point intersection; if (cv::intersectLinePolyline(center, endpoint, contour, intersection)) { intersections.push_back(intersection); } } // 遍历每个交点 for (const auto& intersection : intersections) { // 计算正负方向的像素值 std::vector<uchar> positivePixels, negativePixels; for (int i = 1; i <= 5; i++) { cv::Point positivePoint(intersection.x + i * (center.x - intersection.x) / 5, intersection.y + i * (center.y - intersection.y) / 5); cv::Point negativePoint(intersection.x - i * (center.x - intersection.x) / 5, intersection.y - i * (center.y - intersection.y) / 5); if (positivePoint.x >= 0 && positivePoint.x < res.cols && positivePoint.y >= 0 && positivePoint.y < res.rows) { positivePixels.push_back(res.at<uchar>(positivePoint)); } if (negativePoint.x >= 0 && negativePoint.x < res.cols && negativePoint.y >= 0 && negativePoint.y < res.rows) { negativePixels.push_back(res.at<uchar>(negativePoint)); } } // 计算灰度值最大值和最小值的差值 if (!positivePixels.empty() && !negativePixels.empty()) { int diff = *std::max_element(positivePixels.begin(), positivePixels.end()) - *std::min_element(negativePixels.begin(), negativePixels.end()); // 根据差值大小应用伪彩色 cv::Mat colorMap; cv::applyColorMap(cv::Mat(1, 1, CV_8UC1, cv::Scalar(diff)), colorMap, cv::COLORMAP_JET); cv::Vec3b color = colorMap.at<cv::Vec3b>(0, 0); // 在原图像上绘制伪彩色 cv::circle(res, intersection, 1, cv::Scalar(color[0], color[1], color[2]), 1); } } } // 显示处理后的图像 cv::imshow("result", res); cv::waitKey(0); ``` 以上代码实现了您的要求,具体实现过程如下: 1. 使用OpenCV库读取灰度图像。 2. 对图像进行轮廓检测,得到所有轮廓的坐标集合。 3. 遍历每个轮廓,计算轮廓中心。 4. 对每个轮廓中心,计算和轮廓的180个交点的位置。 5. 遍历每个交点,计算正负方向的5个像素的灰度值。 6. 计算正负方向像素灰度值最大值和最小值的差值。 7. 根据差值大小应用伪彩色。 8. 在原图像上绘制伪彩色。 9. 显示处理后的图像。 以上就是实现您的要求的大致过程,希望能对您有所帮助。

相关推荐

最新推荐

recommend-type

Python Opencv实现图像轮廓识别功能

主要为大家详细介绍了Python Opencv实现图像轮廓识别功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

python-opencv获取二值图像轮廓及中心点坐标的代码

今天小编就为大家分享一篇python-opencv获取二值图像轮廓及中心点坐标的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

opencv python 图像轮廓/检测轮廓/绘制轮廓的方法

主要介绍了opencv python 图像轮廓/检测轮廓/绘制轮廓的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

python+opencv轮廓检测代码解析

主要介绍了python+opencv轮廓检测代码解析,本文实例实现对图片的简单处理,比如图片的读取,灰度显示等相关内容,具有一定借鉴价值,需要的朋友可以参考下
recommend-type

OpenCV-RGB图像灰度化,并提取轮廓

OpenCV—RGB图像灰度化,并提取轮廓 主要功能:加载一个RGB彩色图像,将其转化成灰度图,并采用Canny算法提取灰度图的边缘
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。