opencv之初学第3天

2023-11-12

opencv学习第三天,今天学习一下灰度变换,我对图像不是太了解,我还特地学了一下灰度变换与像素的区别:

像素、灰度、RGB、分辨率_y_xxiii的博客-CSDN博客_像素值和rgb的关系

先来梳理一下不太懂的知识点:

1.关于cvtColor函数,cvtcolor()函数是一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。

OpenCV学习cvtColor函数_1_blue的博客-CSDN博客_cvtcolor

2.clone函数的用法,这是图像的深拷贝,相当于重新创建了一份一模一样的图像。适用于不想改变原图来进行操作:

opencv图像处理学习(六十一)——clone与copyto_光电的一只菜鸡的博客-CSDN博客_opencv clone

3.normalize归一化函数需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

归一化函数normalize详解_DP323的博客-CSDN博客_normalize

4.convertScaleAbs函数是一个位深转化函数,我暂时没有找到很满意的一个解释:

opencv convertScaleAbs函数原理_高祥xiang的博客-CSDN博客_convertscaleabs函数

灰度变换:

1.灰度反转

灰度反转的原理很简单,就是颠倒黑白的运算,处理后的效果看起来像是原图的底片,对于一个8bit的灰度图像,变换公式为:s=255-1-r;可以先看一下效果图:

#include"iostream"
#include"opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main()
{
    Mat image, image_gray, output_image;

    image = imread("D:\\Backup\\Documents\\My Pictures\\1.jpg");
    cvtColor(image, image_gray, COLOR_BGR2GRAY);//灰度化
    imshow("image_gray", image_gray);
    
    output_image = image_gray.clone();//复制灰度图像,便于修改
    for(int i = 0;i<image_gray.rows;i++)
    {
        for(int j = 0; j < image_gray.cols;j++)
            output_image.at<uchar>(i,j) = 255 - image_gray.at<uchar>(i,j);
    }
    imshow("output_image", output_image);
    waitKey(0);
    return 0;
}
    

在我编完之后,又在其他地方看到可以只用"~"就可以实现灰度变换:

image = imread("D:\\Backup\\Documents\\My Pictures\\1234.jpg");

imshow("image",~image);

我都不用把图像灰度化,就可以实现图像反转。。。

2.对数变换

对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:

对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:

x轴的0.4大约对应了y轴的0.8,即原图上0~0.4的低灰度部分经过对数运算后扩展到0~0.8的部分,而整个0.4~1的高灰度部分被投影到只有0.8~1的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。

从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。

opencv代码如下:

#include"iostream"
#include"opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main()
{
	Mat image, image_gray, output_image;//定义输入,输出,灰度图像
	image = imread("D:\\Backup\\Documents\\My Pictures\\1234.jpg");
	cvtColor(image, image_gray, COLOR_BGR2GRAY);//灰度化
    imshow("image_gray",image_gray);

	output_image = image_gray.clone();//复制灰度图像,便于修改
	for(int i = 0;i<image_gray.rows;i++)
	{
		for(int j = 0; j < image_gray.cols;j++)
			output_image.at<uchar>(i,j) =6*log((double)(image_gray.at<uchar>(i,j))+1);
	}

	normalize(output_image, output_image, 0, 255, NORM_MINMAX);//图像归一化,转到0-255范围内
	convertScaleAbs(output_image,output_image);//数据类型转换到CV_8U
	imshow("output_image", output_image);

	waitKey(0);
	return 0;
}

效果图为:

 3.伽马变换

伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:

代码如下:

output_image.at<uchar>(i,j) =6*pow((double)image_gray.at<uchar>(i,j),0.5);

结果如下:

我觉得感觉图像处理不明显,又找了一下资料,换了张图:

关于图像处理的应用我参考了下面的文章:

基础概念扫盲(六):灰度变换 - 知乎

今天就到这里了,感觉也没有很多内容,有些东西也没太懂,但是我消耗的时间也挺长的。 我写博客更多的是一种记录学习过程,我之前学了什么,有什么样的心路历程。加油!

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv之初学第3天 的相关文章

  • brew 链接 jpeg 问题

    我正在尝试安装opencv在 Mac OSX Lion 上 brew install opencv 我收到以下错误 以及其他一些类似的错误 Error The linking step did not complete successful
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 相机标定(OpenCV 2.3)-如何使用畸变参数?

    我有一组带有一些附加标记的刚体图像 我在这些标记之一中定义了一个原点坐标系 我想获得该坐标系与在相机原点定义的坐标系之间的旋转和平移 我尝试了一段时间 POSIT 以下this http goo gl cUYYt 但从未获得可接受的结果 直
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 在加载“cv2”二进制扩展期间检测到递归

    我有一个小程序 在 pyinstaller 编译后返回 opencv 错误 但无需编译即可工作 我在 Windows 10 上使用 Python 3 8 10 Program 导入 pyautogui将 numpy 导入为 np导入CV2
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • 从图像坐标获取对象的世界坐标

    I have been following this http docs opencv org modules calib3d doc camera calibration and 3d reconstruction html docume
  • 如何确定与视频中物体的距离?

    我有一个从行驶中的车辆前面录制的视频文件 我将使用 OpenCV 进行对象检测和识别 但我停留在一方面 如何确定距已识别物体的距离 我可以知道我当前的速度和现实世界的 GPS 位置 但仅此而已 我无法对我正在跟踪的对象做出任何假设 我计划用
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • 将 4 通道图像转换为 3 通道图像

    我正在使用 OpenCV 2 4 6 我正在尝试将 4 通道 RGB IplImage 转换为 4 通道 HSV 图像 下面是我的代码 给出错误 OpenCV 错误 未知函数断言失败 我认为 cvCvtColor 支持 3 通道图像 有没有
  • 在 Visual Studio C++ 2008 中包含 dll

    有没有办法将 dll 包含在项目中 这样我就不必在编译后将这些 dll 与可执行文件放在同一文件夹中 这样我就可以用它们编译我的项目 这是否有可能 如果是 有人可以指导我 我的项目是一个 opencv 项目 有很多 dll 我必须包含在文件
  • VideoCapture.read() 返回过去的图像

    我在跑python3 6 with openCV on the Raspberry pi OS is Raspbian 代码的大致结构如下 The image以时间间隔 3 5 分钟 捕获 被捕获image在函数中处理并返回度量 精度的种类

随机推荐

  • 【CentOS 7.9】基于VMware虚拟机的详细安装教程

    一 下载CentOS 7 9 镜像文件 Linux版本大家自己选择 目前市面还是7 X版本用的多 这里我就以7 9版本为例进行演示 镜像下载地址 https mirrors tuna tsinghua edu cn centos 7 9 2
  • Ubuntu16.04LTS64位安装64JDK9.0.1

    第一步 去Oracle下载JDK 根据自己的需要选择不同的版本 这里选择的JDK9 0 1 下载地址 http www oracle com technetwork java javase downloads jdk9 downloads
  • yolov8保存结果

    找到predictor py文件加上如下代码 for result in self results path result path split images 1 split 0 boxes result boxes box boxes c
  • oracle 数据库truncate,Oracle中的truncate用法

    语法 TRUNCATE TABLE table 在使用truncate语句 DDL语言 可以删除表中的所有记录 使用truncate语句删除数据时 通常要比使用delete语句快得多 这是因为使用truncate语句删除数据时 不会产生任何
  • Spring中进行事务管理的两种方式

    1 Spring中事务管理的API 事务是指逻辑上要么全部成功 要么全部失败的一组操作 例如用户A给用户B转账 则用户A账户余额减少 用户B账户增加这两个操作就是一组事务 必须全部成功或失败撤回操作 不能出现A账户余额减少 B增加失败的情况
  • gvim 编译选项没支持Python. gvim is not python supported

    windows 安装 vim tux 该版本开启了所有的编译支持选项
  • 软件测试工程师工作总结

    1 为什么要在一个团队中开展软件测试工作 因为没有经过测试的软件很难在发布之前知道该软件的质量 就好比ISO质量认证一样 测试同样也需要质量的保证 这个时候就需要在团队中开展软件测试的工作 在测试的过程发现软件中存在的问题 及时让开发人员得
  • 三维物体追踪笔记(1)-基于边缘的三维物体追踪——理论、公式推导与实现

    1 基于边缘检测的三维跟踪建模 三维物体追踪是已知图像中某个物体在已知一系列空间三维点位置 或者是一个3D 模型面片集 的信息下 将这些点通过一个恰到好处的位姿 R t 进行转换后投影到图像上 问题的求解目标是这个位姿 R t 难点是并不知
  • 华院计算

    郭守敬 1231年 1316年 字若思 河北邢台人 郭守敬出生于金哀宗正大八年 1231年 时为宋朝 960年 1279年 但当年的河北地域属于女真族人管治的金国 他40岁那年 大蒙古国忽必烈 1215年 1294年 打败了西夏和金国 建立
  • 北大igem生物计算机,喜讯|北京大学iGEM团队在国际大赛中取得金牌

    原标题 喜讯 北京大学iGEM团队在国际大赛中取得金牌 美国东部时间2017年11月13日下午 在波士顿Hynes会议中心举办的国际基因工程机器大赛 International Genetically Engineered Machine
  • YOLO 算法系列

    我们分享了YOLO系列的文章 包括前段时间刚刚发布的YOLOv7检测算法 虽然YOLOv7对象检测算法是YOLO最新的模型 且可以支持对象分割 人体姿态检测等 但是最新的YOLO系列检测模型也同步进行了更新 那就是刚刚开源的YOLOv8对象
  • 在Ubuntu20.10中搭建TFTP服务器

    TFTP Trivial File Transfer Protocol 是用来下载远程文件的最简单的网络协议 它基于UDP协议而实现 一 安装 sudo apt get install tftp hpa tftpd hpa tftp hpa
  • Apache Hive基础

    Apache Hive基础 Hive优势 提供了一个简单的优化模型 HQL类SQL语法 简化MR开发 支持在不同的计算框架上运行 支持在HDFS和HBase上临时查询数据 支持用户自定义函数 格式 成熟的JDBC和ODBC驱动程序 用于ET
  • matlab如何预测数据,matlab预测数据

    基于MATLAB 的人口预测模型 摘要 本文以 1980 2014 年中国年终总人口数据资料为依据 分别使用了一次拟合 灰色预 测模型和时间序列模型进行拟合 最终得出时间序列模型 基于MATLAB 的人口预测方法分析 易亮 摘要 摘要 本文
  • Android Looper Handler 机制浅析

    最近想写个播放器demo 里面要用到 Looper Handler 看了很多资料都没能理解透彻 于是决定自己看看相关的源码 并在此记录心得体会 希望能够帮助到有需要的人 本文会以 猜想 log验证 的方式来学习 Android Looper
  • java 执行bat文件

    Java代码 cmd c dir 是执行完dir命令后关闭命令窗口 RequestMapping a ResponseBody public Object a String command cmd c D Users qwer Deskto
  • 基于51单片机的自动浇花浇水系统LCD1602显示仿真

    硬件设计 基本框架 该电路的工作原理是由STC89C52单片机和ADC0832组成系统的核心部分 湿度传感器将采集到的数据直接传送到ADC0832的IN端作为输入的模拟信号 选用湿度传感器和AD转换 电路内部包含有湿度采集 AD转换 单片机
  • 7-3 谁是赢家

    7 3 谁是赢家 某电视台的娱乐节目有个表演评审环节 每次安排两位艺人表演 他们的胜负由观众投票和 3 名评委投票两部分共同决定 规则为 如果一位艺人的观众票数高 且得到至少 1 名评委的认可 该艺人就胜出 或艺人的观众票数低 但得到全部评
  • vue 图片,视频点击预览按钮方法

    图片 使用el image viewer组件 写之前注意引入安装组件 主要代码 div class div
  • opencv之初学第3天

    opencv学习第三天 今天学习一下灰度变换 我对图像不是太了解 我还特地学了一下灰度变换与像素的区别 像素 灰度 RGB 分辨率 y xxiii的博客 CSDN博客 像素值和rgb的关系 先来梳理一下不太懂的知识点 1 关于cvtColo