积分图像、图像分割、Harris角点检测

目录

1、积分图像

2、图像分割--漫水填充

3、图像分割--分水岭法

4、Harris角点检测


1、积分图像

 

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;//积分图像
int test()
{//创建一个16×16全为1的矩阵,因为256=16×16Mat img = Mat::ones(16, 16, CV_32FC1);//在图像中加入随机噪声RNG rng(10086);for (int y = 0; y < img.rows; y++){for (int x = 0; x < img.cols; x++){float d = rng.uniform(-0.5, 0.5);//使用.at的形式读出x,y位置像素来进行操作img.at<float>(y, x) = img.at<float>(y, x) + d;}}//计算标准求和积分Mat sum;integral(img, sum);//为了便于显示,转成CV_8U格式Mat sum8U = Mat_<uchar>(sum);namedWindow("sum8U", WINDOW_NORMAL);imshow("sum8U", sum8U);//计算平方求和积分Mat sqsum;integral(img, sum, sqsum);//为了便于显示,转成CV_8U格式Mat sqsum8U = Mat_<uchar>(sqsum);namedWindow("sqsum8U", WINDOW_NORMAL);imshow("sqsum8U", sqsum8U);//计算倾斜求和积分Mat tilted;integral(img, sum, sqsum, tilted);//为了便于显示,转成CV_8U格式Mat tilted8U = Mat_<uchar>(tilted);namedWindow("tilted8U", WINDOW_NORMAL);imshow("tilted8U", tilted8U);waitKey(0);return 0;
}
int main()
{test();system("pause");return 0;
}

2、图像分割--漫水填充

 

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;//图像分割--漫水填充
int test()
{system("color 02");Mat img = imread("E:/testMap/lena.png");if (!(img.data)){cout << "读取图像错误,请确认图像文件是否正确" << endl;return -1;}RNG rng(10086);//随机数,用于随机生成像素//设置操作标志flagsint connectivity = 4;//连通邻域方式int maskVal = 255;//掩码图像的数值int flags = connectivity | (maskVal << 8) | FLOODFILL_FIXED_RANGE;//漫水填充操作方式标志//设置与选中像素点的差值Scalar loDiff = Scalar(20, 20, 20);Scalar upDiff = Scalar(20, 20, 20);//声明掩模矩阵变量,尺寸比输入图像宽高各大2Mat mask = Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);while (true){//随机产生图像中某一像素点int py = rng.uniform(0, img.rows - 1);int px = rng.uniform(0, img.cols - 1);Point point = Point(px, py);//彩色图像中填充的像素值Scalar newVal = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//漫水填充函数int area = floodFill(img, mask, point, newVal, &Rect(), loDiff, upDiff, flags);//输出像素点和填充的像素数目cout << "像素点x: " << point.x << " y : " << point.y << "填充像素数目:" << area << endl;//输出填充的图像结果imshow("填充的彩色图像", img);imshow("掩模图像", mask);//判断是否结束程序int c = waitKey();if ((c & 255) == 27){break;}}waitKey(0);return 0;
}
int main()
{test();system("pause");return 0;
}

3、图像分割--分水岭法

 

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;//图像分割--分水岭法
int test()
{Mat img, imgGray, imgMask, img_;Mat maskWaterShed; //watershed()函数的参数img = imread("E:/testMap/lenaw.png"); //含有标记的图像img_ = imread("E:/testMap/lena.png"); //原图像cvtColor(img, imgGray, COLOR_BGR2GRAY);threshold(imgGray, imgMask, 235, 255, THRESH_BINARY);//二值化Mat k = getStructuringElement(0, Size(3, 3));//生成结构元素morphologyEx(imgMask, imgMask, MORPH_OPEN, k);//开运算imshow("含有标记的图像", img);imshow("原图像", img_);vector<vector<Point>> contours;vector<Vec4i> hierarchy;//轮廓索引编号findContours(imgMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);//在maskWaterShed上绘制轮廓,用于输入分水岭算法maskWaterShed = Mat::zeros(imgMask.size(), CV_32S);for (int index = 0; index < contours.size(); index++){//其中第一个参数image表示目标图像,第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,//第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,第四个参数color为轮廓的颜色,//第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,第六个参数lineType为线型,//第七个参数为轮廓结构信息,	第八个参数为maxLeveldrawContours(maskWaterShed, contours, index, Scalar::all(index + 1), -1, 8, hierarchy, INT_MAX);}//分水岭算法需要对原图像进行处理watershed(img_, maskWaterShed);vector<Vec3b> colors;// 随机生成几种颜色for (int i = 0; i < contours.size(); i++){int b = theRNG().uniform(0, 255);int g = theRNG().uniform(0, 255);int r = theRNG().uniform(0, 255);colors.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));}Mat resultImg = Mat(img.size(), CV_8UC3); // 显示图像for (int i = 0; i < imgMask.rows; i++){for (int j = 0; j < imgMask.cols; j++){//绘制每个区域的颜色int index = maskWaterShed.at<int>(i, j);if (index == -1)//区域间的值被置为 - 1(边界){resultImg.at<Vec3b>(i, j) = Vec3b(255, 255, 255);}else if (index <= 0 || index > contours.size())//没有标记清楚的区域被置为0{resultImg.at<Vec3b>(i, j) = Vec3b(0, 0, 0);}else//其他每个区域的值保持不变: 1,2,…,contours.size(){resultImg.at<Vec3b>(i, j) = colors[index - 1];//把些区域绘制成不同颜色}}}imshow("resultImg", resultImg);resultImg = resultImg * 0.8 + img_*0.2;//addWeighted(resultImg,0.8,img_, 0.2,0, resultImg); imshow("分水岭结果", resultImg);//绘制每个区域的图像for (int n = 1; n <= contours.size(); n++){Mat resImagel = Mat(img.size(), CV_8UC3);//声明一个最后要显示的图像for (int i = 0; i < imgMask.rows; i++){for (int j = 0; j < imgMask.cols; j++){int index = maskWaterShed.at<int>(i, j);if (index == n)resImagel.at<Vec3b>(i, j) = img_.at<Vec3b>(i, j);elseresImagel.at<Vec3b>(i, j) = Vec3b(0, 0, 0);}}//显示图像imshow(to_string(n), resImagel);}waitKey(0);return 0;
}int main()
{test();system("pause");return 0;
}

4、Harris角点检测

 

 

 

 

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;//Harris角点检测
int test()
{Mat img = imread("E:/testMap/lena.png", IMREAD_COLOR);if (!img.data){cout << "读取图像错误,请确认图像文件是否正确" << endl;return -1;}//转成灰度图像Mat gray;cvtColor(img, gray, COLOR_BGR2GRAY);//计算Harris系数Mat harris;int blockSize = 2; //邻域半径int apertureSize = 3;cornerHarris(gray, harris, blockSize, apertureSize, 0.04);//角点检测//归一化便于进行数值比较和结果显示Mat harrisn;normalize(harris, harrisn, 0, 255, NORM_MINMAX);//将图像的数据类型变成CV_8UconvertScaleAbs(harrisn, harrisn);//寻找Harris角点vector<KeyPoint> keyPoints;for (int row = 0; row < harrisn.rows; row++){for (int col = 0; col < harrisn.cols; col++){int R = harrisn.at<uchar>(row, col);if (R >125){//向角点存入KeyPoint中KeyPoint keyPoint;keyPoint.pt.y = row;keyPoint.pt.x = col;keyPoints.push_back(keyPoint);}}}//绘制角点与显示结果drawKeypoints(img, keyPoints, img);imshow("系数矩阵", harrisn);imshow("Harris角点", img);waitKey(0);return 0;
}int main()
{test();system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26393.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qgis添加地理地图书签,快速定位到想要的位置

我们打开qgis软件&#xff0c;一般这个功能区域默认在左侧的中间位置&#xff0c;如图&#xff1a; 如果没有的话&#xff0c;我们需要调出来&#xff0c;在软件上方的菜单栏的空白处&#xff0c;右键显示面板调试框&#xff0c;勾选空间书签管理器面板&#xff0c;即可&…

Perforce Helix Core新版本推出资源压力感知功能,提升服务器可用性,助力大规模开发

您的版本控制系统帮助团队进行主动监控吗&#xff1f; Perforce Helix Core的客户经常在不同维度上测试规模和性能的极限。其中一些维度包括文件数量、文件大小、用户数和并发事务数量。随着这些维度的压力增加&#xff0c;服务器资源&#xff08;如内存和CPU&#xff09;通常…

gee架设教程

1:GameCenter 设置 1.1服务器控制 1.2 账号 1.3.1 配置向导 - 基本设置 1.3.2 配置向导 - 登录网关 1.3.3 配置向导 - 角色网关 1.3.4 配置向导 - 游戏网关 1.3.5 配置向导 - 登录服务器 1.3.6 配置向导 - 数据库服务器 1.3.7 配置向导 - 日志服务器 1.3.8 配置向导 - 主服务器…

Antd List组件增加gutter属性后出现横向滚动,如何解决

第一次使用ant design的List列表组件&#xff0c;设置gutter间隔属性后&#xff0c;页面出现了横向滚动条&#xff0c;查阅文档发现是由于加间隔后导致容器宽度被撑开&#xff0c;ant design官方默认给外层容器加了margin-left和margin-right 解决方法是在外层容器预留一定的pa…

cmake默认编译模式Debug or Release

CMAKE的编译选项 在阅读一些工程源码中&#xff0c;CMakeLists文件通常看到一下内容&#xff1a; set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -g -Wall")那我们的编译时&#xff0c;用的到底是哪一个呢&a…

vue3和tauri直接下载Binary 数组的二进制文件内容到本地

通过发送url请求&#xff0c;直接获取到一个文件的Binary 数组内容&#xff0c;然后通过tauri的api&#xff1a;writeBinaryFile保存文件到本地电脑。 发送请求的时候&#xff0c;要加上响应类型&#xff1a;responseType: ResponseType.Binary 然后等返回的响应内容&#xf…

解决Spring Data JPA查询存在缓存问题及解决方案

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐

这篇文章&#xff0c;主要介绍PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐。 目录 一、PDFBox操作图片 1.1、添加本地图片 &#xff08;1&#xff09;案例代码 &#xff08;2&#xff09;运行效果 &#xff08;3&#xff09;方…

学校招生报名小程序开发笔记(一)

背景 这是一个以报名为核心的职业学校招生小程序&#xff0c;目的是方便想要系统学习技能&#xff0c;入门某项技能或者领域的初高中毕业生&#xff0c;了解该学校的基本情况及各个专业&#xff0c;并提供报名路径&#xff0c;致力于技能型人才培养 功能规划 主要功能包括专…

IntelliJ IDEA下载安装教程

目录 友情提醒第一章、IDEA软件下载1.1&#xff09;官网下载 第二章、IDEA软件安装2.1&#xff09;以"ideaIU-2018.3.3.exe"为例3.2&#xff09;启动IDEA软件 友情提醒 点击文章目录可以跳转 第一章、IDEA软件下载 IDEA 全称 IntelliJ IDEA。在智能代码助手、代码…

互联网医院牌照|互联网医院牌照办理|互联网医院申办

互联网医院牌照是一种医疗机构执业许可证&#xff0c;在行业中也称为“互联网医疗许可证”。互联网医院牌照由卫生健康委员会颁发&#xff0c;一般分为两种&#xff1a;一种是互联网医疗信息服务资质&#xff0c;另一种是互联网诊疗资质。那么如何申办互联网医院牌照呢&#xf…

面试之双亲委派原理

一面腾讯提问:如果我自定义一个 new Object 类&#xff0c;请问这个类是否会被加载&#xff1f; 回答&#xff1a;不会&#xff0c;因为双亲委派&#xff0c;向上加载。回答的过程中磨磨唧唧。当然最后一面也是没有过。 总之一句话&#xff1a;向上加载&#xff0c;向下委派. …