【c++|opencv】一、基础操作---3.访问图像元素

news2024/11/14 23:15:02

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

访问图像元素

1. 访问图像像素

1.1 访问某像素

//灰度图像:
image.at<uchar>(j, i) //j为行数,i为列数
//BGR彩色图像
image.at<Vec3b>(j, i)[0] //B分量
image.at<Vec3b>(j, i)[1] //G分量
image.at<Vec3b>(j, i)[2] //R分量

1.2 遍历像素

以添加噪声为例

1.2.1 准备

创建添加噪声函数

Salt.h

#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include <random>

using namespace cv;
using namespace std;

void Salt(Mat img,int n); // n加入噪声点数

Salt.cpp

#include "Salt.h"

void Salt(Mat img,int n){
    // 随机数生成器
    default_random_engine generater;
    uniform_int_distribution<int> randRow(0,img.rows-1);
    uniform_int_distribution<int> randCol(0,img.cols-1);

    int i,j;
    for (int k=0;k<n;k++){
        i=randRow(generater);
        j=randCol(generater);

        if (img.channels() == 1){
            img.at<uchar>(i,j) = 255;
        }
        else if (img.channels() == 3){
            img.at<Vec3b>(i,j)[0] = 255;
            img.at<Vec3b>(i,j)[1] = 255;
            img.at<Vec3b>(i,j)[2] = 255;
        }
    }
}

1.2.2 添加噪声

#include "Salt.h"
#include <iostream>
#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;


int main(){
    Mat img = imread("/home/v/home.png");
    if (img.empty()){
        cout<<"Could not open or find the image"<<endl;
        return -1;
    }

    imshow("Img",img);

    Salt(img,5000); // 加入噪声点
    imshow("Salt",img);
    waitKey(0);
    return 0;
}

在这里插入图片描述

1.3 指针遍历

1.3.1 以卷积运算为例

#include "Salt.h"
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main(){
    Mat img = imread("/home/v/home.png");
    if (img.empty()){
        cout<<"Could not open or find the image"<<endl;
        return -1;
    }

    Mat out_img;
    out_img = Mat(img.size(),img.type()); // 定义输出图像大小
    out_img = img.clone(); // clone原图像像素值

    int rows = img.rows; // 原图行数
    int stepx = img.channels(); // 原图通道数
    int cols = (img.cols)*img.channels(); // 矩阵总列数

    for (int row=1;row<rows-1;row++){
        const uchar* previous = img.ptr<uchar>(row-1); // 原图上一行指针
        const uchar* current = img.ptr<uchar>(row); // 原图当前行指针
        const uchar* next = img.ptr<uchar>(row+1); // 原图下一行指针

        uchar* output = out_img.ptr<uchar>(row); // 输出图像当前指针

        for (int col=stepx;col<cols-stepx;col++){ // 对列进行遍历
            // saturate_cast<uchar>(a) 当a小于0,输出0,当a大于255输出255,0-255之间原样输出
            output[col] = saturate_cast<uchar>(5*current[col]-(previous[col]+current[col-stepx] + current[col+stepx] + next[col]));
        }
    }
    imshow("Img",img);
    imshow("Out",out_img);

    waitKey(0);
    return 0;
}

在这里插入图片描述

1.3.2 自带的卷积运算

#include "Salt.h"
#include <iostream>
#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;


int main(){
    Mat img = imread("/home/v/home.png");
    if (img.empty()){
        cout<<"Could not open or find the image"<<endl;
        return -1;
    }
    Mat out_img;

    Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
    filter2D(img,out_img,img.depth(),kernel); // 卷积

    imshow("Img",img);
    imshow("Out",out_img);
    waitKey(0);
    return 0;
}

在这里插入图片描述

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

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

相关文章

清华 ChatGLM-6B 中文对话模型部署简易教程

本文目录 一、前言二、下载三、部署3.1 配置环境3.2 启动 demo 程序3.2.1 启动 cli_demo.py3.2.2 启动 web_demo.py 四、【最新】ChatGLM-6B-int4 版本教程4.1 下载4.2 配置环境4.3 启动 demo 程序 五、华为 CodeLab 免费 GPU 平台部署 ChatGLM-6B-int4&#xff08;CPU版&#…

移植wpa_supplicant及简单使用

嵌入式环境下的设备有时会需要能连接到外网进行一些数据的交互&#xff0c;通过利用wpa_supplicant客户端结合有线网卡或无线网卡&#xff0c;即可配置好网络达到目的。 资源&#xff1a;openssl-0.9.8e.tar.gz wpa_supplicant-0.7.3.tar.gz 源代码下载路径一&#xff1a;http…

激光雷达,被降本“牺牲”?

激光雷达&#xff0c;正在成为车企「价格战」的牺牲品。尤其是纯视觉方案带来的巨大显性降本效应&#xff0c;开始动摇车企的传感器配置策略。 本周&#xff0c;随着极越01的上市&#xff0c;相比去年发布的探月版车型39.98万的定价&#xff0c;大幅下降至24.99-33.99万&#…

【c++|opencv】二、灰度变换和空间滤波---1.灰度变换、对数变换、伽马变换

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 灰度变换、对数变换、伽马变换 1. 灰度变换 #include <iostream> #include <opencv2/opencv.hpp>using namespace std; using namespace c…

pytorch复现2_AlexNet

不涉及原理 AlexNet网络结构 代码&#xff1a; model&#xff1a; import torch.nn as nn import torchclass AlexNet(nn.Module):def __init__(self, num_classes1000, init_weightsFalse):super(AlexNet, self).__init__()self.features nn.Sequential(nn.Conv2d(3, 48, k…

mongdb 存在重复字段值,建立唯一索引失败

1. 插入两条相同的数据 db.user.insertOne({name:"test",age:30, })2. 创建索引 db.user.createIndex({name:1},{unique: true});3. 报错

《2023北京智慧城市创新应用案例集》丨附下载

✦ ✦✦ ✦✦ ✦✦ ✦ 建设数字中国是数字时代推进中国式现代化的重要引擎&#xff0c;是构筑国家竞争新优势的有力支撑。党的二十大报告提出要提高城市规划、建设、治理水平&#xff0c;“打造宜居、韧性、智慧城市”&#xff1b;要加快发展数字经济&#xff0c;促进数字经济…

常用 sqlite3 命令

本次将向您讲解 SQLite 编程人员所使用的简单却有用的命令。这些命令被称为 SQLite 的点命令&#xff0c;这些命令的不同之处在于它们不以分号 ; 结束。 让我们在命令提示符下键入一个简单的 sqlite3 命令&#xff0c;在 SQLite 命令提示符下&#xff0c;您可以使 用各种 …

PTA 树的同构

题目 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2&#xff0c;则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的&#xff0c;因为我们把其中一棵树的结点A、B、G的左右孩子互换后&#xff0c;就得到另外一棵树。而图2就不是同构的。 现给定两棵树…

广播机制-广播接收者BroadcastReceiver

在Android中&#xff0c;广播是一种在组件之间传递消息的机制&#xff0c;例如电池电量低时会发送一条提示如果要接收并过滤广播中的消息&#xff0c;则需要使用Broadcast Receiver&#xff08;广播接收者&#xff09;。广播接收者是Android四大组件之一&#xff0c;通过广播接…

dockerfile中临时拉取gitlab代码

git clone https://<name>:<token>gitlab.com/<USER>/<REPO>.git

基于STM32F103C8T6的UAV飞控板硬件设计

一、主控单元&#xff1a; 主控单元基于意法半导体公司的STM32F103C8T6单片机进行设计。STM32F103C8T6DE 内核为ARM Cortex-M3&#xff1b;最大主频&#xff1a;72MHz &#xff1b;工作电压范围&#xff1a;2V~3.6V &#xff1b;程序存储容量&#xff1a;64KB&#xff1b; 程序…

qtableview委托应用

https://download.csdn.net/download/venice0708/88485153

Python构造代理IP池提高访问量

目录 前言 一、代理IP是什么 二、代理IP池是什么 三、如何构建代理 IP 池 1. 从网上获取代理 IP 地址 2. 对 IP 地址进行筛选 3. 使用筛选出来的 IP 地址进行数据的爬取 四、总结 前言 爬虫程序是批量获取互联网上的信息的重要工具&#xff0c;在访问目标网站时需要频…

【广州华锐互动】牛顿运动定律VR虚拟教学软件

在科技日新月异的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为我们带来了前所未有的沉浸式体验。在教育领域&#xff0c;VR技术的应用也日益广泛&#xff0c;尤其是在物理教学中&#xff0c;牛顿运动定律VR虚拟教学软件为学生…

预制件二维码怎么生成

在建筑施工领域&#xff0c;预制构件的使用越来越广泛&#xff0c;它能够提高工程质量和施工效率&#xff0c;减少施工现场对环境的影响。通过凡尔码的二维码管理平台&#xff0c;用户可以实现预制构件的高效管理&#xff0c;并提升施工效率和施工质量 预制件二维码怎么生成 准…

org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解

openfeign无法导入的问题 我感觉最近带的好几个新人在搭建springCloud基础框架的时候&#xff0c;会犯一个非常小的错误&#xff0c;导致进度卡住了。 这个错误就是Feign导入的错误&#xff1a; ‘dependencies.dependency.version’ for org.springframework.cloud:spring-c…

乐鑫 SoC 内存映射入门

微控制器 (MCU) 的性能和内存能力逐步提升&#xff0c;其复杂度也随之加大。特别是当用户需要配置内存管理单元来映射外部存储器芯片 (Flash/SPIRAM) 时&#xff0c;这种现象尤其明显。 开始在乐鑫 SoC 上运行 Zephyr RTOS 时&#xff0c;会发现这些 SoC 与 ARM 架构的 MCU 相…

Java进阶(HashMap)——面试时HashMap常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合&#xff0c;需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中HashMap集合的面试问题&#xff0c;结合源码分析题目背后的知识点。 关于List的博客文章如下&#xff1a; Java进阶&#xff08;List&#xff09;——面试…

CPU架构之x86解读

一&#xff0e;什么是x86架构 X86架构&#xff1a;是微处理器执行的计算机语言指令集&#xff0c;指一个intel通用计算机系列的标准编号缩写&#xff0c;也标识一套通用的计算机指令集。 编辑搜图 二、x86架构的优势 技术成熟&#xff1a;x86架构的芯片经过多年的发展&#…