(Opencv①)图像基本知识

1.图像格式

①BMP格式:Windows系统下最标准的图像格式,未经过压缩,一般图像文件较大。

②JPEG格式:应用最广泛的图像格式,一般采用有损压缩算法。

③GIF格式:可以是动图也可以是静态图。

④PNG格式:与JPG格式类似,压缩比高于GIF,支持图像透明,支持Alpha通道调节图像的透明度。

⑤TIFF格式

2.图像尺寸

图像尺寸的长和宽是以像素为单位的,像素与分辨率像素是数码影像中最基本的单位,每个像素就是一个小点,而不同颜色的点(像素)聚集起来就变成一幅动人的照片。一般来说,图片分辨率越高,所需的像素就越多。说明一下,分辨率是单位长度中所表达或截取的像素数目。每英寸图像内的像素点数,单位是像素每英寸(PPI)。图像分辨率越高, 像素的点密度越高,图像越清晰。

图像一般分为灰度图和彩色图。灰度图是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,像素点数值范围在0到255之间,0表示黑、 255表示白,其它值表示处于黑白之间; 彩色图像,每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。

从通道数和位深度来说明图片类型,图像的位深度是指每个像素点数值所占的二进制位数。位深度越大则图像能表示的颜色数就越多,色彩越丰富。一般选击图片,查看图片属性可以看到位深度的信息。

(Opencv①)图像基本知识

如图位深度为24,说明该图为24位三通道的彩色图。相应的若位深度为8,则说明改图为8位单通道的灰色图。有时位深度为32,则为三通道的基础上加上一层Alpha通道,Alpha通道是用来定义图片的透明度信息。

 3.图像处理常见操作

3.1读取图像

函数:cv2.imread()

作用:读取图片。

第一个参数为图片路径。

第二个参数为读取方式。0代表以灰度图形式打开,1代表以彩色图形式打开。代码如下:

import cv2
img = cv2.imread('split.jpg',1)
print(img.shape)

3.2图像显示

函数:cv2.imshow()

作用:展示图片。

第一个参数为窗口名字,即你自己给你要展示的窗口命名。

第二个参数为你要展示的图像的变量名。

cv2.imshow函数往往配合cv2.destroyAllWindows()和cv2.waitKey()一起使用。

函数:cv2.destroyAllWindows()

作用:关闭所有图片窗口

函数:cv2.waitKey()

作用:键盘绑定函数,等待键盘指令后才会继续运行代码。

参数:数字代表毫秒,若参数输入1000,即1秒后继续执行代码。若参数输入为0,则等待键盘输入为止,再继续运行代码。

示范代码如下:

import cv2
img = cv2.imread('split.jpg',1)
cv2.imshow('photo',img)
k=cv2.waitKey(0)
cv2.destroyAllWindows()

弹出图片后,摁任意键即会运行后续代码,关闭窗口。

 3.3图片存储

函数:cv.imwrite()

第一个参数写入保存路径+图像名(包括格式)。

第二个参数写入要保存的图片数据的变量名。

示范代码如下:

#导入opencv依赖库
import cv2

#读取图像,读取方式为彩色读取
img = cv2.imread('split.jpg',1)
#
cv2.imshow('photo',img)
k = cv2.waitKey(0)
if k == 27:   # 输入ESC键退出
    cv2.destroyAllWindows()
elif k == ord('s'): # 输入S键保存图片并退出
    cv2.imwrite('split_.jpg',img)
cv2.destroyAllWindows()

3.4图片灰度转换

有时我们需要将图片由灰度图转换成彩色图,有时需要将灰度图转换成彩色图。

从数学公式上来说:将彩色图转换成灰度图只需:

Gray = B*0.114+G*0.587+R*0.299 (B:blue,G:green,R:red)

将灰度图转换成彩色图只需:

B=G=R=Gray

opencv实现

函数:cv2.cvtColor(img,flag)

第一个参数:待转化图像变量名。

第二个参数:转化模式。输入参数量cv2.COLOR_BGR2GRAY将彩色图转换为灰度图。输入参数量cv2.GRAY2BGR将灰度图转换为彩色图。本质是通道数的变换。

import cv2
img = cv2.imread('girl.jpg',cv2.IMREAD_UNCHANGED)##该图片为三通道图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR)

cv2.imshow("gray_image",img)
cv2.imshow("image",img_gray)
cv2.imshow('image2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

print(img.shape)
print(img_gray.shape)
print(img2.shape)

 3.5图像通道分离与合并

对于彩色图片,有时需要对其三通道中的某一通道操作。

函数:cv2.split()

参数:图像变量名

示范代码如下:

#加载opencv
import cv2
src=cv2.imread('split.jpg')
cv2.imshow('before',src)
#调用通道分离
b,g,r=cv2.split(src)
#三通道分别显示
cv2.imshow('blue',b)
cv2.imshow('green',g)
cv2.imshow('red',r)
cv2.waitKey(0)
cv2.destroyAllWindows()

 运行此段代码后,你会发现展示的图像全是灰度图,和我们预想的得到蓝绿红图片不一致。这是为什么?因为此时是单通道图,只能是灰度图。想让图像显示蓝色,绿色,红色应该建立三通道图的情况下,让其中两个通道分量的各值为0。代码如下:

#导入opencv模块
import numpy as np
import cv2            
 
image=cv2.imread("split.jpg")#读取要处理的图片
cv2.imshow("src",image)
cv2.waitKey(0)
B,G,R = cv2.split(image)#分离出图片的B,R,G颜色通道

zeros = np.zeros(image.shape[:2],dtype="uint8")#创建与image相同大小的零矩阵
cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]))#显示 (B,0,0)图像
cv2.imshow("GREEN",cv2.merge([zeros,G,zeros]))#显示(0,G,0)图像
cv2.imshow("RED",cv2.merge([zeros,zeros,R]))#显示(0,0,R)图像
cv2.waitKey(0)
cv2.destroyAllWindows()

代码中函数:cv2.merge()

参数1:待合并的通道名,注意要以列表的形式输入。

作用:通道分离后,对单独通道操作后,最后将各通道合并为彩色图。

3.6 GBR与RGB的转化

 opencv库读取图片时默认按GBR格式读取,当我们要用Matplotlib库展示图像时要先将GBR格式转换为RGB格式。一般有两种方法,一种用opencv自带的方法,一种用numpy的方法。

函数:cv2.cvtcolor()

第一个参数为变量名,第二个参数为转换模式,若输入cv2.COLOR_BGR2RGB代表将BGR图片转化成RGB图片。

代码如下:

import cv2 
import matplotlib.pyplot as plt 
img = cv2.imread("test2.png", cv2.IMREAD_COLOR)
cv2.imshow("Opencv_win", img)
# 用opencv自带的方法转
img_cv_method = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 用numpy转,img[:,:,::-1]列左右翻转
img_numpy_method = img[:,:,::-1] # 本来是BGR 现在逆序,变成RGB
# 用matplot画图
plt.subplot(1,3,1)
plt.imshow(img_cv_method)
plt.subplot(1,3,2)
plt.imshow(img_numpy_method)
plt.subplot(1,3,3)
plt.imshow(img)
plt.savefig("./plt.png")
plt.show()
#保存图片
cv2.imwrite("opencv.png", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 3.7图像直方图

图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。它统计了每一个强度值所具有的像素个数。
函数:cv2.calcHist(images,channels,mask,histSize,ranges)
参数1:待统计图像,需用中括号括起来;
参数2:待计算的通道;
参数3:Mask,这里没有使用,所以用None。
参数4:histSize,表示直方图分成多少份;
参数5:是表示直方图中各个像素的值,[0.0, 256.0]表 示直方图能表示像素值从0.0到256的像素。直方图是对图像像素的统计分布,它统计了每个像素(0到255)的数量。
代码如下:
#加载第三方库
from matplotlib import pyplot as plt
import cv2

girl = cv2.imread("girl.jpg")
cv2.imshow("girl", girl)
# girl.ravel()函数是将图像的三位数组降到一维上去,
#256为bins的数目,[0, 256]为范围
plt.hist(girl.ravel(), 256, [0, 256])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年6月13日
下一篇 2022年6月13日

相关推荐