OpenCV像素点的计算,好家伙,直接降龄化教学。。。代码对图片的神奇操作~~~~~~
opecv浅记
这篇博客从代码,理论以及一些实际操作角度讲解像素运算
长文
文章目录
- opecv浅记
- 像素点的运算
- 1.像素点
- 2.对像素点运算
- ①.普通运算
- ②.逻辑运算
- 3.简单应用及其原理
- ①.图像的对比度与亮度操作
- ②.图像融合(凯隐和拉亚斯特,原谅博主中二了。:joy:)
- ③.炫彩logo
- ④.动态提取彩色的颜色帧
- 总结
像素点的运算
像素点的运算即,基于OpenCV可调用API的运算,或者以numpy做一些简易的运算,但是还是更偏向于与直接调用API,它一般要比我们用numpy实现的算法高效很多。
1.像素点
在第一篇OpenCV的文章中,我们已经提过,一般情况下,一个图片的包含了,高,宽,通道数,三个指标。在RBG色彩空间中,每个通道数对应三原色中的一种,总共三个通道。
0——蓝
1——绿
2——红
可用 image.shape将高,宽,通道数调出。
所谓的像素点,其实就是在(0,0,0)到 (高,宽,3)区间内的点,我们假设取一个(x,y,z)
那么x便是高度,y为宽度,而z便是当前通道数,也可以说当前维度,先前曾写过遍历每个像素点并进行计算的代码,如下:
def get_image_info(image):height=image.shape[0]width=image.shape[1]channels=image.shape[2]print('height: {},width: {},channels: {}'.format(image.shape[0],image.shape[1],image.shape[2]))for i in range(height):for j in range(width):for c in range(channels):cv=image[i,j,c]image[i,j,c]=255-cvreturn image
其本质为,对一个图像的取反操作。
对三维空间来说,很容易理解,那么我们再来看每个像素点的值,在读图时,我们可以用dtype方法将数据位数输出出来,通常为uint8,即无符号八位,这就跟像素点的取值产生了关系,无符号八位的取值为0~255,这与像素点的取值范围相同,而255对应着最亮,0对应的最暗,通道0的每个点若都取到255,则为一张纯蓝色的图,先前已经说过,这里提出只是更透彻地明白像素点的含义。
2.对像素点运算
对像素点的运算可以笼统的分为两大类:普通运算与逻辑运算
①.普通运算
加减乘除,加权加法,均值与方差
像素运算,更可以从矩阵的每个元素的运算来理解。由简入繁,从简单的来说,如下是两个三维矩阵这里只打印其中一个,对应三通道:
import numpy as nparray_1=np.ones([2,2,3],np.uint8)
array_2=np.ones([2,2,3],np.uint8)
print(array_1)
像素点的加法,是对其中每个元素进行相加。得到如下:
接下来对图像文件进行操作,加法:
def __add__(image_1,image_2):re_image=cv.add(image_1,image_2)return re_image
结果如下,这时候我们如果将,他们按矩阵打印出来,就会发现,与上面的简单加法是相同的。
减法,乘法,除法类似:
#像素运算,相减,从1中扣去2
def __subtract__(image_1,image_2):return cv.subtract(image_1,image_2)
#像素,相除操作,除以2
def __divide__(image_1,image_2):return cv.divide(image_1,image_2)
#像素的乘法
def __multiply__(image_1,image_2): return cv.multiply(image_1,image_2)
这里我们就不难想到了,既然规定范围为0~255那么,乘法在很大概率上都会超过255,除法在很大概率上都会很小,因此乘法得到的图像白色居多,而除法得到的图像黑色居多。
加权加法:
cv2.addWeighted(image1,w1,image2,w2,b)
将它的返回值视为一个y的话,其实它是对每个像素点进行这样的计算:
取均值
这里的均值取得是每个通道图的均值,即假设有三个通道,那么返回的应该是一个四元组,前三元每一元对应每个通道图的所有值所求的均值,最后一元应该是alpha通道,对应透明度,可以稍作验证:
import numpy as np
import cv2 as cvarray_1=np.ones([2,2,3],np.uint8)
array_2=np.ones([2,2,3],np.uint8)
array_3=np.ones([2,2,3],np.uint8)*2
print(array_3)
print(cv.mean(array_3))
结果:
没什么问题。
方差与均值
可调用以下API
import numpy as np
import cv2 as cvarray_1=np.ones([2,2,3],np.uint8)
array_2=np.ones([2,2,3],np.uint8)
array_3=np.ones([2,2,3],np.uint8)*2
print(array_3)
print(cv.meanStdDev(array_3))
结果:第一个array为上面所说,第二个array为方差
②.逻辑运算
逻辑运算,位运算,在很多人在高中就已经接触到了二进制,但是对于二进制的按位运算应该还是在大学开始的。位运算先前有写过博客,对于像素的位运算,我们只说三种
按位与,按位或,按位取反,在此之前,我们需要说一下三种简单的位运算。
按位取反。。。淦,之前的博客没写,没法截图偷懒了。。。
按位取反很简单,对0取1,对1取0,对于001101来说就是110010
对于像素点的逻辑运算需要借用opencv的API:
#逻辑运算
def __logicopera__(image_1,image_2):cv.imshow('logic_1',cv.bitwise_and(image_1,image_2))cv.imshow('logic_2',cv.bitwise_or(image_1,image_2))cv.imshow('logic_3',cv.bitwise_not(image_1))
其结果:
从像素点的角度来说,主要说一下取反的操作,这里的取反其实是与开头那段代码的作用不谋而合的,即对每个像素点进行255-的操作。至于按位与和按位或,应该可以自己理解。
3.简单应用及其原理
在介绍完几种运算,可以实现一些简单的应用,
这里还要说到一个东西,掩膜,我们利用inRange方法提取出来的东西,通称之为掩掩膜,对于该方法陌生的小伙伴:点击这里,最后的代码有细说。掩膜,即提取图像的某部分后,仅仅该部分为白色,其余为黑色。很多操作都需要用到掩膜。
①.图像的对比度与亮度操作
调用OpenCVAPI,加权加法运算
#图像的对比度与亮度操作 通过加权运算实现
def contrast__brightness(image,c,b):#通过原图与黑图的加权运算h,w,ch=image.shapeblank_image=np.zeros([h,w,ch],image.dtype)dst=cv.addWeighted(image,c,blank_image,1-c,b)cv.imshow('dst',dst)
如下为效果,左图为原图,该代码可用于简单的美白。
OpenCV像素点的计算,好家伙,直接降龄化教学。。。代码对图片的神奇操作~~~~~~相关推荐
- OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法
OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法 前言: 以前笔者在项目中经常使用到OpenCV的算法,而大部分OpenCV的算法都需要进行遍历操作,而且很多遍历操作都是需要对目标像素点的 ...
- 信用卡数字识别(opencv,轮廓计算)
目录 1.项目数据及源码 2.环境配置 2.1.导入工具包 2.2.设置参数 3.模板处理 3.1.转二值图像 3.2.计算轮廓 4.数据处理 4.1.初始化卷积核,图像预处理 4.2.顶帽操作 4. ...
- 使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析
使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析 1. 效果图 2. 原理 3. 源码 3.1 直方图3种计算方法和2种绘制方法 3.2 Mask遮罩图像直方图 参考 这篇博客将 ...
- 使用OpenCV和Python计算图像的“彩色度”
使用OpenCV和Python计算图像"彩色度" 1. 效果图 2. 炫彩度量方法是什么? 3. 源代码 参考 你是否尝试过计算每个图像的炫彩值,并根据炫彩值对自己的图像数据集进行 ...
- OpenCV Lucas-Kanade光流计算的实例(附完整代码)
OpenCV Lucas-Kanade光流计算的实例 OpenCV Lucas-Kanade光流计算的实例 OpenCV Lucas-Kanade光流计算的实例 #include <iostre ...
- 详解为什么OpenCV的直方图计算函数calcHist()计算出的灰度值为255的像素个数为0
在使用OpenCV的直方图计算函数calcHist()时,发现灰度值为255的像素个数总是为0. 哪怕图像中灰度值为255的像素个数不为0,使用OpenCV的直方图计算函数calcHist()计算出的 ...
- OpenCV 图像直方图计算calcHist()
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/keith_bb/article/details/56680997 图像直方图是对数据集合的一种统计方 ...
- OpenCV视差图计算
OpenCV视差图计算 如今立体视觉越来越多的被应用到工业检测.机器人.自动驾驶.AR/VR领域,因为目前自己也在一个产品研发期,自己倒腾了几天做了一些通过双目进行避障的小实验,把一些比较流程化的代码 ...
- OpenCV每日函数 计算摄影模块(1) 图像修复算法 inpaint函数
一.概述 该算法使用区域邻域恢复图像中的选定区域.该功能可用于去除扫描照片上的灰尘和划痕,或去除静止图像或视频中不需要的物体. 二.inpaint函数 1.函数原型 void cv::inpaint ...
最新文章
- 看完这部纪录片之后,我想把身上的细菌寄生虫供起来
- RoadMap,走出自己的特色主义
- DOS命令行中用MAVEN构建Java和Java Web项目
- 【论文解读】IPM2020 | 长短期兴趣建模的图神经网络新闻推荐系统
- API网关—系统的门面要如何做呢?
- response的运行过程
- Double Strings
- 编辑框CEdit自动换行简单设置
- 一个 结构体保存和窗口位置大小记录的类
- 项目中的通用查询参数类,它体现了项目架构的大局观
- em算法 实例 正态分布_4-EM算法原理及利用EM求解GMM参数过程
- centos7利用libreoffice将doc文件转换为pdf
- 易基因 | 植物DNA甲基化专题 | NAR:拟南芥AtHDA6与着丝粒周围DNA甲基化关系研究
- 精读《图解密码技术》--第一章 环游密码世界
- Linux零基础入门(一)初识Linux
- vue打包之后浏览器图标设置直接没有输出,vue打包之后浏览器图标不显示
- readxl包导入excel报错Error: `path` does not exist解决方法
- 机器视觉自动数据标注方法
- HTML5前端开发实战08-外语培训
- ImageJ对荧光信号离散的细胞计数方法
热门文章
- 【安全-前端】XSS、XSRF
- python爬音乐-用python爬取网易云音乐歌曲的歌词
- LV124 LV148
- 最最完整的二维码生成教程:MFC下利用libqrencode库生成二维码,显示在屏幕上并保存
- 量子计算入门学习笔记(六 量子测量-上 )
- linux 测试路由速度慢,LINUX服务器性能常用测试脚本 – 硬件信息/网速/延迟/路由等...
- 测试驱动开发(TDD)For PHP
- mysql位运算 索引_mysql 使用位运算
- vue项目webpack打包配置
- Get和Post的区别以及注意点