opencv学习记录(一)

本文记录了小白作者opencv的学习历程,仅供参考!

作者是使用python做图像处理,在pycharm中安装opencv库:File>>setting>>Python Interpreter  点击+号,搜索opencv-python进行下载。

一、图像读取原理

图像的基本单位是像素,300*500的图片就是由300*500=150000个像素组成,每个像素可以看成单元格,每个单元格的颜色可以使用不同的像素值代表(0-255,0代表黑色,255代表白色,数值越大,颜色越浅)

opencv的图像读取就是使用像素单元格的原理,使用cv2.imread()函数,读取并便利每个单元格的像素值。

进行图像读取时,一般有两个参数:

读取彩色图片时为img=cv2.imread("my.jpg",cv2.IMREAD_UNCHANGED),cv2.IMREAD_GRAYSCALE参数可换为3

读取灰度图片时为

img=cv2.imread("my.jpg",cv2.IMREAD_GRAYSCALE),cv2.IMREAD_GRAYSCALE参数可换为0

二、图像显示函数cv2.imshow() [函数原型 cv2.inshow(name,img)]

图像显示原理是获得像素数组img的size,设定一张空白图片,将提取出来的像素数组中的单位像素赋值到空白图片进行显示。

一般cv2.imshow()需要和cv2.waitKey(0)配合使用。cv2.waitKey(a)是一个界面退出函数,根据参数a的取值判断如何退出界面。当a=0时,时间无限长,直到有键按下,退出界面。当a>0时,函数返回值为按下的键的ASCII码值,超时返回-1,图像显示a秒,有窗口显示的时候,waitKey才有作用。

Matplotlib图像显示库

注意:OpneCv读取的图像格式是BGR格式的,而matplotlib显示图像是以RGB格式进行显示,所以,我们需要对图像进行格式转化,从BGR通道转为RGB通道格式,这样显示出来才不会有色差。

三、图像保存函数cv2.imwrite(filepath,img,num)

filepath:保存文件路径

img:读取图像数组,保存之前要先读取

num:可选参数,可以省略

图片属性:

基本属性:像素、分辨率、大小、颜色、位深、色调、饱和度、亮度、色彩通道、图像的层次。

使用shape函数能获得图片的属性:下面是获得图片的尺寸和色彩通道。

仅获得图片尺寸:

ROI兴趣区域

机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,既ROI。opencv中常用到算子(operator)和函数来求得ROI。ROI属于IVE技术(智能视频编码)的一种,在不损失图像质量的前提下,优化视频性能。

下面的代码是获得一块高度200:400,宽度200:500区域的图像:

 ROI区域移植

ROI区域移植在生活中的应用最普遍的就是给图片添加水印,将想添加的内容添加到图片上。

将一幅图片添加到另一幅图片,代码如下:

 图像通道

对于图像通道是指彩色图片,灰度图片一般不考虑,彩色图片由三基色B\G\R通过混合而成,Python中对于通道的获取通过对像素组进行操作实现。B(blue),G(green),R(red),蓝绿红。代码如下: 

import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
img=cv2.imread("jiesi.jpg")
#3通道获取
B=img[:,:,0]
G=img[:,:,1]
R=img[:,:,2]
#打印3通道
print('B',B)
print('G',G)
print('R',R)
B= cv2.cvtColor(B,cv2.COLOR_BGR2RGB)
G= cv2.cvtColor(G,cv2.COLOR_BGR2RGB)
R= cv2.cvtColor(R,cv2.COLOR_BGR2RGB)
#显示图像
titles = ['B通道', 'G通道','R通道']  #标题
images = [B,G,R]   #图像对比显示
for i in range(3):
    plt.subplot(1,3,i+1), plt.imshow(images[i])
    plt.title(titles[i])
    plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
plt.show()#显示图像

可以使用B, G, R = cv2.split(img)  split()函数拆分通道,将三基色分组

B, G, R = cv2.split(img)的效果跟 B=img[:,:,0]    G=img[:,:,1]    R=img[:,:,2]是一样的

 图像通道合并

opencv中通道的合并主要通过cv2.merge([B, G, R]) 函数实现,其中的参数变为BGR通道。

opencv图像灰度处理的四种方法和原理 

四种方法:基于OpenCV库函数的图像灰度化最大值灰度化平均值灰度化Gamma校正灰度化

图像灰度化处理:将3通道图像的B\R\G通道的像素值从不相等设置为相等的过程。

一、基于OpenCV库函数的图像灰度化

cv2.cvtColor()函数灰度处理:

函数使用:img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

        img:需要进行处理的图像

        cv2.COLOR_BGR2GRAY:固定参数,对图像进行灰度处理固定使用,OpenCV读取图像        通过BGR空间进行读取,因此需要将BGR转换成GRAY进行灰度化。

代码如下:

#引入图片,将图片进行灰度化处理,将BGR格式转换成GRAY格式  将得到的图片进行转换格式,
# BGR转换成RGB,最后使用matplotlib.pyplot库中的函数进行显示
import cv2
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
img=cv2.imread("jiesi.jpg")
hui=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(hui,cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.title("杰斯议员灰度处理")
plt.axis("off")
plt.show()

二、最大值灰度化

最大值灰度化原理:最大值灰度化原理就是以B、G、R通道中最大的像素值作为整体像素,公式为:B=G=R=max([B,G,R])

 三、平均值灰度化

平均值灰度化的原理:对B、G、R三通道像素求平均值作为灰度值,公式为:gray=(B+G+R)/3

 四、Gamma校正灰度化

 

四种灰度化方法的效果比较:

代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取第一张图像
img=cv2.imread("jiesi.jpg")
#获取图像尺寸
h,w=img.shape[0:2]
gray1= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#BGR转换为灰度显示格式   #库函数,Y亮度
#自定义空白单通道图像,用于存放灰度图
gray2=np.zeros((h,w),dtype=img.dtype)#最大值
gray3=np.zeros((h,w),dtype=img.dtype)#平均值
gray4=np.zeros((h,w),dtype=img.dtype)#Gamma校正灰度处理
#对原图像进行遍历,然后分别对B\G\R按比例灰度化
for i in range(h):
    for j in range(w):
        gray2[i,j]=max(img[i,j,0],img[i,j,1],img[i,j,2]) #最大值
for i in range(h):
    for j in range(w):
        gray3[i,j]=(int(img[i,j,0])+int(img[i,j,1])+int(img[i,j,2]))/3 #平均值
for i in range(h):
    for j in range(w):
        a=img[i,j,2]**(2.2)+1.5*img[i,j,1]**(2.2)+0.6*img[i,j,0]**(2.2) #分子
        b=1+1.5**(2.2)+0.6**(2.2) #分母
        gray4[i,j]=pow(a/b,1.0/2.2)  #开2.2次方根  #Gamma校正灰度处理
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
gray1= cv2.cvtColor(gray1,cv2.COLOR_BGR2RGB)
gray2= cv2.cvtColor(gray2,cv2.COLOR_BGR2RGB)
gray3= cv2.cvtColor(gray3,cv2.COLOR_BGR2RGB)
gray4= cv2.cvtColor(gray4,cv2.COLOR_BGR2RGB)
#显示图像
titles = ['cv2.cvtColor()', '最大值灰度化','平均值灰度化','Gamma校正灰度化']  #标题
images = [gray1, gray2,gray3,gray4]   #图像对比显示
for i in range(4):
    plt.subplot(1,4,i+1), plt.imshow(images[i])
    plt.title(titles[i])
    plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
plt.show()#显示图像

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值