前言:本文是我在学习opencv时记录的笔记,内容较为简洁,会记录从入门到做项目这段时间的内容,最终目的是完成我的毕业设计,欢迎大家给予批评指正。本篇为第一本书《Python-OpenCV从入门到精通》的笔记。
前两章为安装,略过。

第三章 图像处理的基本操作

import cv2

图像处理的基本操作分为:

1.读取图像

image = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/3/01/3.1.jpg")  #读取彩色图像
image_Gray = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/3/01/3.1.jpg",0)  #读取灰色图像

其中:
cv2.imread(filename,flags),返回的是读取到的图像。参数filename为要读取的文件名,包括路径。
参数flags为读取类型标记,默认是1,彩色图像。若写为0,则读取灰色图像。

2.显示图像

cv2.imshow("flower",image)   #显示图像
a = cv2.waitKey(3000)     #等待按键
cv2.destroyAllWindows()   #销毁所有窗口
print(a)

其中:
cv2.imshow(winname,mat)用于显示图像。参数winname为显示图像的窗口名称。参数mat为要显示的图像。
cv2.waitKey(delay)用于等待用户按下按键,若在delay时间内按下某按键,则返回对应按键的ASCII码,若在时间内没有按下按键,则返回-1。参数delay的单位为ms,当值为负数、0或空时表示无限等待。
cv2.destroyAllWindows()用于销毁所有正在显示的窗口。

3.保存图像

cv2.imwrite("E:/studying/opencv/Picture/1.jpg",image) #保存图片

其中:
cv2.imwrite(filename,img)用于按照指定路径保存图像。参数filename为保存图像的完整路径,参数img为要保存的图像。

4.获取图像属性

print(
    "shape=",image.shape,
    "size=",image.size,
    "dtype=",image.dtype
      )#彩色图像

print(
    "shape=",image_Gray.shape,
    "size=",image_Gray.size,
    "dtype=",image_Gray.dtype
      )#灰色图像

其中:
image.shape是一个包含图像的垂直像素、水平像素、通道数的数组,灰度图像的通道数为1;
image.size是图像包含的像素个数(垂直像素×水平像素×通道数)
image.dtype是图像的数据类型。

第四章 像素的操作

1.像素

像素是构成数字图像的基本单位,每一图像都是由M行N列的像素组成的。

px = image[291,218]
print("坐标(291,218)上的像素的BGR值是",px)

以上为坐标(291,218)对应像素的BGR值,例如[36 42 49]
什么是BGR呢?在opencv中,常用的RGB色彩空间被BGR色彩空间取代,每3个数值表示一个像素,这三个数值分别表示蓝色、绿色、红色3种颜色分量,把每一种颜色分量所在的区域称为通道,[36 42 49]即为各通道的值。
我们还可以分别获取各通道上的值:

blue = image[291,218,0]
green = image[291,218,1]
red = image[291,218,2]
print(blue,green,red)

其中:0表示B通道,1表示G通道,2表示R通道。
我们可以对BGR值进行修改:
对某一像素点修改:

image[291,218] = [255,255,255]

对某一范围进行修改:

for i in range(241,292):
    for j in range(168,219):
        image[i,j] = [255,255,255]

2.使用NumPy模块操作像素

NumPy的基本操作不在此赘述。
在OpenCV中,黑白图像实际上是一个二维数组,彩色图像是三维数组,数组中每个元素就是图像对应位置的像素值。
创建黑白图像:
在黑白图像中,像素值为0表示纯黑,像素值为255表示纯白。

import cv2
import numpy as np

width = 200 #图像的宽
height = 100 #图像的高
img_Black = np.zeros((height,width),dtype=np.uint8)#纯黑图像
img_White = np.ones((height,width),dtype=np.uint8)*255#纯白图像
cv2.imshow("imgb",img_Black)
cv2.imshow("imgw",img_White)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

opencv python 加按钮 opencv教程python_计算机视觉


创建黑白相间的图像:

import cv2
import numpy as np

width = 200 #图像的宽
height = 100 #图像的高
img = np.zeros((height,width),dtype=np.uint8)#纯黑图像
for i in range(0,width,40):
    img[:,i:i+20]=255
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

创建彩色图像:
创建三维数组,修改最后一个索引代表的元素值,根据BGR的顺序,索引0表示蓝色分量,索引1表示绿色分量,索引2表示红色分量。

#创建彩色图像
import cv2
import numpy as np

width = 200 #图像的宽
height = 100 #图像的高
img = np.zeros((height,width,3),dtype=np.uint8)
blue = img.copy()
blue[:,:,0] = 255
green = img.copy()
green[:,:,1] = 255
red = img.copy()
red[:,:,2] = 255
cv2.imshow("blue",blue)
cv2.imshow("green",green)
cv2.imshow("red",red)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

opencv python 加按钮 opencv教程python_opencv_02

创建随机图像:

img = np.random.randint(256,size=(height,width,3),dtype=np.uint8)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

拼接图像
水平拼接数组:array = numpy.hstack(tup)
垂直拼接数组:array = numpy.vstack(tup)
其中,参数tup为要拼接的数组元组,返回值array为拼接后的新数组。

img = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/3/01/3.1.jpg")
img_h = np.hstack((img,img))
img_v = np.vstack((img,img))
cv2.imshow("img_h",img_h)
cv2.imshow("img_v",img_v)

第五章 色彩空间与通道

1.色彩空间

1.GRAY色彩空间
通常指的是灰度图像,0~255的数值表示不同亮度的深灰色或浅灰色,0表示纯黑,255表示纯白。
转换色彩空间:
dst = cv2.cvtColor(src, code)
dst:转换后的图像,src:转换前的初始图像,code:色彩空间转换码。
从BGR色彩空间转换到GRAY色彩空间的转换码:cv2.COLOR_BGR2GRAY

image = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/3/01/3.1.jpg")  #读取图像
cv2.imshow("bgr",image)
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray_image)

2.HSV色彩空间
BGR色彩空间是基于蓝色、绿色、红色而言的,而HSV色彩空间基于色调、饱和度、亮度而言。
其中,色调(H)是指光的颜色,在区间[0, 180]内取值。例如红色的色调值是0,黄30、绿60、蓝120。
饱和度(S)指色彩的深浅,在区间[0, 255]内取值。当饱和度为0时,图像变为灰色图像。
亮度(V)是指光的明暗,在区间[0, 255]内取值。亮度值越大,图像越亮,当亮度值为0时,图像呈纯黑色。
同样,也可以从BGR转为HSV。常用转换码是cv2.COLOR_BGR2HSV和cv2.COLOR_HSV2BGR。

2.通道

在BGR色彩空间中,图像的通道由B通道、G通道、R通道构成。
1.拆分通道
b,g,r = cv2.split(bgr_image)
其中,b,g,r分别为B,G,R通道的图像,bgr_image为一幅BGR图像。
对于BGR图像,只要B,G,R三个通道的值都相同,就可以得到灰度图像。
拆分HSV图像:h,s,v = cv2.split(hsv_image)
2.合并通道
bgr = cv2.merge([b,g,r])

b,g,r = cv2.split(image)拆分通道
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
bgr = cv2.merge([b,g,r])#合并通道

3.alpha通道
OpenCV在BGR色彩空间的基础上,增加的用于设置图像透明度的A通道,形成BGRA色彩空间,alpha通道在[0, 255]内取值,0表示透明,255表示不透明。

import cv2

img_bgr = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/3/01/3.1.jpg")

img_bgra = cv2.cvtColor(img_bgr,cv2.COLOR_BGR2BGRA)
b, g, r, a = cv2.split(img_bgra)
a[:, :] = 172
img_bgra_172 = cv2.merge([b,g,r,a])
a[:,:] = 0
img_bgra_0 = cv2.merge([b,g,r,a])
cv2.imwrite("E:/studying/opencv/Picture/img_bgra.png",img_bgra)
cv2.imwrite("E:/studying/opencv/Picture/img_bgra_172.png",img_bgra_172)
cv2.imwrite("E:/studying/opencv/Picture/img_bgra_0.png",img_bgra_0)

运行效果:

opencv python 加按钮 opencv教程python_python_03

PNG图像是一种典型的4通道(B,G,R,A)图像,因此被保存的图像格式均为.png。
至此,入门篇结束。