积分图像、图像分割、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.mzph.cn/news/1224.shtml

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

相关文章

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测,含混淆矩阵图、分类图)

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测&#xff0c;含混淆矩阵图、分类图) 目录 分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测&#xff0c;含混淆矩阵图、分类图…

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

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

用宏定义完成整数的二进制位的奇偶位互换

代码如下&#xff1a; #include <stdio.h> #define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1))int main() {int num 1010;printf("%d\n", num);printf("%d\n", SWAP(num));return 0; }思路如下&…

MySQL数据备份与还原、索引、视图

一.备份与还原 /***************************样例表***************************/ CREATE DATABASE booksDB; use booksDB; CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL …

统计页面左右+上下自适应布局

1:如果需要调整分栏数量,那么只需要删除对应数据,修改百分比即可. <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css" lang"less" >body{margin: 0px ;}.box…

微信小程序用户登录及头像昵称设置教程(前后端)

目录 1.背景分析 2.具体需求分析 3.前端设计 3.1 用户登录 3.2 头像昵称填写&#xff08;个人信息界面&#xff09; 4.后端设计 4.1项目架构分析 4.2 代码分析 实体类 dao层 service层 controller层 工具类 5.nginx部署 6.效果演示 1.背景分析 众所周知&#x…

论文解读|VoxelNet:基于点云的3D物体检测的端到端学习

原创 | 文 BFT机器人 01 摘要 论文提出了表述了一个新的基于点云的3D检测方法&#xff0c;名为VoxelNet&#xff0c;该方法是一个端到端可训练的深度学习架构&#xff0c;利用了稀疏点云的结构特性&#xff0c;直接在稀疏的3D点上进行操作&#xff0c;并通过高效的并行处理体素…

01 - 如何制定性能调优标准?

1、为什么要做性能调优&#xff1f; 一款线上产品如果没有经过性能测试&#xff0c;那它就好比是一颗定时炸弹&#xff0c;你不知道它什么时候会出现问题&#xff0c;你也不清楚它能承受的极限在哪儿。 有些性能问题是时间累积慢慢产生的&#xff0c;到了一定时间自然就爆炸了…

Linux —— 进程状态

目录 一&#xff0c;进程状态分类 二&#xff0c;僵尸进程 三&#xff0c;孤儿进程 一&#xff0c;进程状态分类 进程状态反应进程执行过程中的变化&#xff0c;状态会随外界条件的变化而转换&#xff1b; 三态模型&#xff0c;运行态、就绪态、阻塞态&#xff1b;五态模型…

SpringCloud微服务(三)RabbitMQ、SpringAMQP、elasticsearch、DSL、MQ、ES详细介绍

目录 一、初始MQ 同步调用 异步调用 什么是MQ 执行下面的命令来运行MQ容器&#xff1a; 如果冲突了&#xff0c;可以先查询 RabbitMQ概述 常见消息模型 HelloWorld案例 二、SpringAMQP 引入依赖 Work Queue 消费预取限制 ​编辑 发布、订阅 发布订阅Fanout Ex…

进阶C语言——字符串和内存函数

今天我们学点库函数 字符函数和字符串函数 求字符串长度函数->strlen strlen需要的头文件是string.h ,那它的作用是什么呢&#xff1f;&#xff1f; 他是来求字符串长度的&#xff0c;统计的是’\0’前的字符串长度 #include<stdio.h> #include<string.h> int …

紫光展锐CEO任奇伟博士:用芯赋能,共建XR新生态

7月6日&#xff0c;2023世界人工智能大会在上海世博中心及世博展览馆盛大开幕。紫光集团高级副总裁、紫光展锐CEO任奇伟博士受邀出席芯片主题论坛&#xff0c;并发表题为《用芯赋能&#xff0c;共建XR新生态》的演讲。 世界人工智能大会自2018年创办以来已成功举办五届&#xf…

1.4 MVP矩阵

MVP矩阵代表什么 MVP矩阵分别是模型&#xff08;Model&#xff09;、观察&#xff08;View&#xff09;、投影&#xff08;Projection&#xff09;三个矩阵。 我们的顶点坐标起始于局部空间&#xff08;Local Space&#xff09;&#xff0c;在这里他成为局部坐标&#xff08;L…

面试题更新之-DOCTYPE html相关问题

文章目录 <!DOCTYPE html>是什么&#xff1f;为什么要在html文件开头加上一个<!DOCTYPE html>DOCTYPE的作用&#xff0c;严格与混杂模式的区别&#xff0c;有何意义HTML5为什么只需要写<!DOCTYPE HTML> 是什么&#xff1f; 是HTML文档的文档类型声明&#xf…

Redis进阶

Redis之父安特雷兹 redis x.x.x第二位是偶数的是稳定版本 redis7安装单机物理机安装&#xff1a; https://blog.csdn.net/G189D/article/details/129185947 数据类型 bitmap 统计二值状态的数据类型 最大位数2^32位&#xff0c;他可以极大的节约存储空间&#xff0c;使用…

postman 自动化测试

postman 自动化测试 0、写在前面1、变量引用1.1、如何在请求体中引用变量 0、写在前面 在有些时候看官方文档 比网上搜索效率要高&#xff0c; 比如网上搜一通还是不知道用法或者没有搜索到你想要的用法的时候。 postman官方文档 : https://learning.postman.com/docs/introdu…

layui选项卡演示

layui选项卡演示 .1 引入layui2. 选项卡演示实列3.js分离的代码4运行结果 在前端开发中&#xff0c;选项卡常用于展示多个内容模块&#xff0c;提供用户友好的界面交互方式。layui作为一款简洁易用的前端框架&#xff0c;提供了丰富的组件库&#xff0c;其中包括了强大且易用的…

《MySQL》事务

文章目录 概念事务的操作属性&#xff08;aicd&#xff09; 概念 一组DML语句&#xff0c;这组语句要一次性执行完毕&#xff0c;是一个整体 为什么要有事务&#xff1f; 为应用层提供便捷服务 事务的操作 有一stu表 # 查看事务提交方式(默认是开启的) show variables like au…

pytorch深度学习逻辑回归 logistic regression

# logistic regression 二分类 # 导入pytorch 和 torchvision import numpy as np import torch import torchvision from torch.autograd import Variable import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import matplotlib.pyplot as …

Kafka第二课-代码实战、参数配置详解、设计原理详解

一、代码实战 一、普通java程序实战 引入依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.4.1</version></dependency><dependency>&l…