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像素点的计算,好家伙,直接降龄化教学。。。代码对图片的神奇操作~~~~~~相关推荐

  1. OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法

    OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法 前言: 以前笔者在项目中经常使用到OpenCV的算法,而大部分OpenCV的算法都需要进行遍历操作,而且很多遍历操作都是需要对目标像素点的 ...

  2. 信用卡数字识别(opencv,轮廓计算)

    目录 1.项目数据及源码 2.环境配置 2.1.导入工具包 2.2.设置参数 3.模板处理 3.1.转二值图像 3.2.计算轮廓 4.数据处理 4.1.初始化卷积核,图像预处理 4.2.顶帽操作 4. ...

  3. 使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析

    使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析 1. 效果图 2. 原理 3. 源码 3.1 直方图3种计算方法和2种绘制方法 3.2 Mask遮罩图像直方图 参考 这篇博客将 ...

  4. 使用OpenCV和Python计算图像的“彩色度”

    使用OpenCV和Python计算图像"彩色度" 1. 效果图 2. 炫彩度量方法是什么? 3. 源代码 参考 你是否尝试过计算每个图像的炫彩值,并根据炫彩值对自己的图像数据集进行 ...

  5. OpenCV Lucas-Kanade光流计算的实例(附完整代码)

    OpenCV Lucas-Kanade光流计算的实例 OpenCV Lucas-Kanade光流计算的实例 OpenCV Lucas-Kanade光流计算的实例 #include <iostre ...

  6. 详解为什么OpenCV的直方图计算函数calcHist()计算出的灰度值为255的像素个数为0

    在使用OpenCV的直方图计算函数calcHist()时,发现灰度值为255的像素个数总是为0. 哪怕图像中灰度值为255的像素个数不为0,使用OpenCV的直方图计算函数calcHist()计算出的 ...

  7. OpenCV 图像直方图计算calcHist()

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/keith_bb/article/details/56680997 图像直方图是对数据集合的一种统计方 ...

  8. OpenCV视差图计算

    OpenCV视差图计算 如今立体视觉越来越多的被应用到工业检测.机器人.自动驾驶.AR/VR领域,因为目前自己也在一个产品研发期,自己倒腾了几天做了一些通过双目进行避障的小实验,把一些比较流程化的代码 ...

  9. OpenCV每日函数 计算摄影模块(1) 图像修复算法 inpaint函数

    一.概述 该算法使用区域邻域恢复图像中的选定区域.该功能可用于去除扫描照片上的灰尘和划痕,或去除静止图像或视频中不需要的物体. 二.inpaint函数 1.函数原型 void cv::inpaint ...

最新文章

  1. 看完这部纪录片之后,我想把身上的细菌寄生虫供起来
  2. RoadMap,走出自己的特色主义
  3. DOS命令行中用MAVEN构建Java和Java Web项目
  4. 【论文解读】IPM2020 | 长短期兴趣建模的图神经网络新闻推荐系统
  5. API网关—系统的门面要如何做呢?
  6. response的运行过程
  7. Double Strings
  8. 编辑框CEdit自动换行简单设置
  9. 一个 结构体保存和窗口位置大小记录的类
  10. 项目中的通用查询参数类,它体现了项目架构的大局观
  11. em算法 实例 正态分布_4-EM算法原理及利用EM求解GMM参数过程
  12. centos7利用libreoffice将doc文件转换为pdf
  13. 易基因 | 植物DNA甲基化专题 | NAR:拟南芥AtHDA6与着丝粒周围DNA甲基化关系研究
  14. 精读《图解密码技术》--第一章 环游密码世界
  15. Linux零基础入门(一)初识Linux
  16. vue打包之后浏览器图标设置直接没有输出,vue打包之后浏览器图标不显示
  17. readxl包导入excel报错Error: `path` does not exist解决方法
  18. 机器视觉自动数据标注方法
  19. HTML5前端开发实战08-外语培训
  20. ImageJ对荧光信号离散的细胞计数方法

热门文章

  1. 【安全-前端】XSS、XSRF
  2. python爬音乐-用python爬取网易云音乐歌曲的歌词
  3. LV124 LV148
  4. 最最完整的二维码生成教程:MFC下利用libqrencode库生成二维码,显示在屏幕上并保存
  5. 量子计算入门学习笔记(六 量子测量-上 )
  6. linux 测试路由速度慢,LINUX服务器性能常用测试脚本 – 硬件信息/网速/延迟/路由等...
  7. 测试驱动开发(TDD)For PHP
  8. mysql位运算 索引_mysql 使用位运算
  9. vue项目webpack打包配置
  10. Get和Post的区别以及注意点