opencv python 基础入门(1)

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉机器学习软件库,可以运行在LinuxWindowsAndroidMac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

注意: 由于历史遗留问题,opencv采用BGR模式,而不是RGB。

RGB代表红绿蓝。大多数情况下,RGB颜色存储在结构或无符号整数中,蓝色占据最不重要的“区域”(32位和24位格式的字节),绿色第二少,红色第三少。

BGR是相同的,除了区域顺序颠倒。红色占据最不重要的区域,绿色占第二位(静止),蓝色占第三位。

1、图像读取

cv2.imread(filename, flags=None)
----------------------
imread(filename,flag) 读取图片,返回图片对象
    filename: 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None
    flag:cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1
          cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0
          cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1

2、图片性质

import cv2
img = cv2.imread("C:/path/to/image/doge.png")

#rows,cols,channels
img.shape   #返回(280, 450, 3), 宽280(rows),长450(cols),3通道(channels)
#size
img.size    #返回378000,所有像素数量,=280*450*3
#type
img.dtype   #dtype('uint8')

3、像素获取和编辑

#获取和设置
pixel = img[100,100]  #[57 63 68],获取(100,100)处的像素值
img[100,100]=[57,63,99] #设置像素值
b = img[100,100,0]    #57, 获取(100,100)处,blue通道像素值
g = img[100,100,1]    #63 Green通道
r = img[100,100,2]      #68 Red通道
r = img[100,100,2]=99    #设置red通道值

#获取和设置
piexl = img.item(100,100,2)
img.itemset((100,100,2),99)

4、ROI截取

#ROI,Range of instrest
roi = img[100:200,300:400]  #截取100行到200行,列为300到400列的整块区域
img[50:150,200:300] = roi   #将截取的roi移动到该区域 (50到100行,200到300列)
b = img[:,:,0]  #截取整个蓝色通道

b,g,r = cv2.split(img) #截取三个通道,比较耗时
img = cv2.merge((b,g,r))

5、显示图片

cv.imshow('dst', dst)
cv.waitKey(0)
cv.destroyAllWindows()
----------------------------
imshow(winname, mat):显示图片,窗口自适应图片大小
    window_name: 指定窗口的名字
    mat:显示的图片对象
    可以指定多个窗口名称,显示多个图片
    
waitKey(millseconds)  键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同)
    millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0时,会一直等待键盘事件
destroyAllWindows(window_name) 
    window_name: 需要关闭的窗口名字,不传入时关闭所有窗口

6、写入图片

imwrite(filename, img, params=None)
    filename:保存的文件名
    img:文件对象

python 图片灰度化 opencv-python

1、简介

opencv是一个强大的图像处理和计算机视觉库,实现了很多实用算法,而opencv-python是OpenCV的python接口。直接安装opencv-python包(非官方):

 pip install opencv-python

2、知识点

图片都是像素点

图片是由一个一个的像素点组成的,像素是图像的最小单元,我们右键——>属性去查看图片的信息,看到图片的尺寸如下图:即宽度是372个像素,高度也是300个像素,也就是说这张图片是由一个372 * 300的像素点矩阵构成的,这个矩阵是372行,300列,共有372 * 300 = 111600个像素点。

图片的像素信息

绝大部分图片是 RGB 类型的,即是用RGB(红绿蓝)三原色组成的图片。在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个分量的值分别为:255,0,0

3、图片灰度化

什么叫图片的灰度化呢?其实很简单,就是让像素点矩阵中的每一个像素点都满足下面的关系:R=G=B(就是红色变量的值,绿色变量的值,和蓝色变量的值,这三个值相等),此时的这个值叫做灰度值。

理解一张图片是由一个像素点矩阵构成,就知道我们对图像的处理就是对这个像素点矩阵的操作,想要改变某个像素点的颜色,只要在这个像素点矩阵中找到这个像素点的位置,比如第x行,第y列,所以这个像素点在这个像素点矩阵中的位置就可以表示成(x,y),因为一个像素点的颜色由红、绿、蓝三个颜色变量表示,所以我们通过给这三个变量赋值,来改变这个像素点的颜色,比如改成红色(255,0,0),可以表示为(x,y,(R=255,G=0,B=0))x行y列的像素值为(255,0,0)。

平均值法:

是转化后R,G,B的值为转化前R,G,B的平均值

灰度化后的R=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的G=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的B=(处理前的R + 处理前的G +处理前的B)/ 3

加权平均法(处理效果最好):

按照一定权值,对R,G,B的值加权平均

灰度化后的R =  处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的G =  处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的B =  处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11

最大值发:

使转化后的R,G,B得值等于转化前3个值中最大的一个

   灰度化后的R、G、B=处理前的R、G、B中的最大值

4、代码示例

# 先加载一张图片 打印它的一些关键信息
image = cv.imread("C:/path/to/image/doge.png")
print(image.shape) # (372, 300, 3)
print(image.size) # 334800
print(image.dtype) # uint8
def gray_by_max():
    # 最大值法:使转化后的R,G,B得值等于转化前3个值中最大的一个,即: R=G=B=max(R,G,B)这种方法转换的灰度图亮度很高。
    dst = np.zeros((image.shape[0], image.shape[1], 1), np.uint8)
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            dst[i, j] = max(image[i, j][0], image[i, j][1], image[i, j][2])
    print(dst)
    cv.imwrite("C:/path/to/image/doget_max_gray.png", dst)
最大灰度法
def gray_by_avg():
    # 平均值法:是转化后R,G,B的值为转化前R,G,B的平均值。即:R=G=B=(R+G+B)/3  这种方法产生的灰度图像比较柔和。
    dst = np.zeros((image.shape[0], image.shape[1], 1), np.uint8)
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            dst[i, j] = (image[i, j][0] + image[i, j][1] + image[i, j][2]) / 3
    print(dst)
    cv.imwrite("C:/path/to/image/doget_avg_gray.png", dst)
平均灰度法
def gray_with_weight():
    # 加权平均值法:按照一定权值,对R,G,B的值加权平均,即:R=G=B=(W(r) * R+ W(g) * G+ W(b) * B),
    # 其中W(x)分别为R,G,B的权值,取不同的值形成不同的灰度图像。由于人眼对绿色最为敏感,红色次之,对蓝色的敏感性最低,因此一般情况下,
    # W(r)=0.299, W(g)=0.587, W(b)=0.114得到的灰度图像效果最好。
    dst = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            dst[i, j] = (0.3 * image[i, j][0] + 0.11 * image[i, j][1] + 0.59 * image[i, j][2])
    print(dst)
    cv.imwrite("C:/path/to/image/doget_weight_gray.png", dst)
加权灰度法