opencv-python学习笔记-1基础知识——研0基础学习

(一)OpenCV-Python学习—基础知识 通过上述的平移,缩放,旋转的组合变换即实现了仿射变换,上述多个变换的变换矩阵相乘即能得到组合变换的变换矩阵。src:坐标点矩阵,注意其格式. 如src=np.array([[589, 91],[1355, 91],[1355, 219],[589, 219]], np.float32).reshape(-1, 1, 2), 表示四个坐标点,size为(4, -1, 2)dst: 转换后的对应四组坐标,如np.float32([[0,0],[300,0],[0,300],[300,300]]) 阅读详情

一、图像的介绍

  1. 图像以像素存储,若只有黑白颜色的三色图,为单通道,一个像素对应矩阵中的一个数字,数值为0到255。其中0表示最暗(黑色),255表示最亮(白色)。
    在这里插入图片描述
    对于RGB模式的彩色图片,为三通道图,Red、Green、Blue三原色。一个像素块对应矩阵中的一个向量,分别表示三种颜色的比例。
    在这里插入图片描述
    需要注意的是,由于历史遗留问题,opencv采用BGR模式,而不是RGB

二、图像读取保存操作(cv2)

  1. 图像的读取:cv2.imread(img_path,flag)
    img_path: 图片的路径
    flag:
    cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1
    cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0
    cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1

  2. 图像的写入:cv2.imshow(window_name,img)
    window_name: 指定窗口的名字
    img:显示的图片对象
    可以指定多个窗口名称,显示多个图片

  3. 图像的保存:cv2.imwrite(img_path_name,img)
    img_path_name:保存的文件名
    img:文件对象

# 将导入包名另命名
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('messi5.jpg',0)
# 2 显示图像
# 2.1 利用opencv展示图像
cv.imshow('image',img)
# 调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。
k = cv.waitKey(0)
# 3 保存图像
cv.imwrite('messigray.png',img)

在这里插入图片描述
1.jpg
2.jpg

用cv2读取彩色图片通道顺序为B、G、R,PIL显示图片是R、G、B顺序,因此读出来图片颜色会改变,需要对图像通道进行调序。

未调整前

import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
img = cv.imread("E:\\3.jpg")
# 将图片输出到屏幕
plt.imshow(img)
plt.show() 

在这里插入图片描述
调整后

import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
img = cv.imread("E:\\3.jpg")
# 调整通道顺序
# split()将img分裂为三通道
b,g,r = cv.split(img)
# merge()将三通道合并
img = cv.merge([r,g,b])
# 将图片输出到屏幕
plt.imshow(img)
plt.show()  

在这里插入图片描述
加入了两行代码,如下

b,g,r = cv.split(img)
img = cv.merge([r,g,b])

三、图像像素获取和编辑

  1. 获取像素值,更改像素值
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
# 获取(100,100)处的像素值
pixel = img[100,100]
# 将[100,100]处的像素值设置为[0,0,0]
img[100,100]=[0,0,0]
# 将图片输出到屏幕
plt.imshow(img)
plt.show() 

更改前,[100,100]处像素值为[254,174,201]
在这里插入图片描述
更改后,[100,100]处的像素值为[0,0,0]
在这里插入图片描述

  1. 获取[100,100]处单通道像素值,并更改单通道像素值
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
# 获取(100,100)处的像素值
pixel = img[100,100]
#获取单通道像素值
b = img[100,100,0]
g = img[100,100,1]
r = img[100,100,2]
#更改red通道值
r = img[100,100,2]=0
# 将图片输出到屏幕
plt.imshow(img)
plt.show() 

更改后[100,100]处red像素值变为0.
在这里插入图片描述

  1. 使用函数获取单通道像素值:piexl = img.item(x,y,i)
    x表示横坐标,y表示纵坐标,i表示从左到右第几个元素。
    此处i可选用0,1,2.从左到右分别为b通道,g通道,r通道
  2. 使用函数设置单通道像素值:img.itemset((x,y,i),num)
    x,y,i同上。num自0~255取值,表示rgb颜色数值。
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
# 获取(100,100)处的像素值
pixel = img[100,100]
# 通过img.item()操作,可以直接定位到对应的区域。
# 即获取[100,100]处的第1个元素
piexl = img.item(100,100,0)
# itemset((x, y), z) 中的(x,y)代表的就是矩阵中元素位置,‘z’为该元素的值
img.itemset((100,100,0),99)
# 将图片输出到屏幕
plt.imshow(img)
plt.show()

在这里插入图片描述

四、图片性质及截取

  1. List item
    输出图片宽,长,通道数
import numpy as np
from PIL import Image
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
print(img.shape)

此处表示图片为宽500(rows),长500(cols),3通道(channels)
在这里插入图片描述

  1. 输出所有像素数
import numpy as np
from PIL import Image
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
print(img.size)

此处表示5005003=750000
在这里插入图片描述

  1. 输出图片数字类型
import numpy as np
from PIL import Image
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
print(img.dtype)

在这里插入图片描述

  1. ROI截取
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
#截取100行到200行,300列到400列
roi = img[100:200,300:400]
#将截取的区域roi移动到该区域
img[50:150,200:300] = roi
# 将图片输出到屏幕
plt.imshow(img)
plt.show()

原图
在这里插入图片描述
移动完
在这里插入图片描述
截取通道

import numpy as np
from PIL import Image
import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
img = Image.open("E:\\3.jpg")
# 导入数组
img = np.array(img)
# 截取整个蓝色通道
b = img[:,:,0]
# 截取三个通道
b,g,r = cv.split(img)
# 按照rgb重新组合
img = cv.merge((r,g,b))
# 将图片输出到屏幕
plt.imshow(img)
plt.show()

在这里插入图片描述

五、添加边界

  1. cv2.copyMakeBorder()
    参数:
    img:图像对象
    top,bottom,left,right: 上下左右边界宽度,单位为像素值
    borderType:
    cv2.BORDER_CONSTANT, 带颜色的边界,需要传入另外一个颜色值
    cv2.BORDER_REFLECT, 边缘元素的镜像反射做为边界
    cv2.BORDER_REFLECT_101/cv2.BORDER_DEFAULT
    cv2.BORDER_REPLICATE, 边缘元素的复制做为边界
    CV2.BORDER_WRAP
    value: borderType为cv2.BORDER_CONSTANT时,传入的边界颜色值,如[0,255,0]
    在这里插入图片描述

六、图像的运算

  1. 像素算数运算
    cv2.add(img1,img2,mask:None,dtype:-1)
    相加的两个图片,应该有相同的大小和通道
    img1:图片对象1
    img2:图片对象2
    mask:None (掩膜,一般用灰度图做掩膜,img1和img2相加后,和掩膜与运算,从而达到掩盖部分区域的目的)
    dtype:-1
import numpy as np
from PIL import Image
import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
plt.rc("font", family='Microsoft YaHei')
img1 = Image.open("E:\\3.jpg")
img2 = Image.open("E:\\4.jpg")
img1 = np.array(img1)
img2 = np.array(img2)
# cv中的加法
img3 = cv.add(img1,img2)
# 直接相加
img4 = img1+img2
# 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img3[:,:,::-1])
axes[0].set_title("cv中的加法")
axes[1].imshow(img4[:,:,::-1])
axes[1].set_title("直接相加")
plt.show()

在这里插入图片描述

cv2.add(img1,img2)函数表示两个同类型的图像,对应矩阵的值相加,若大于255,则取255.

  1. 混合
    这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。

    img3 = cv.addWeighted(img1,alpha,img2,beta,gamma,dtype)
    参数:
    img1:图片对象1
    alpha:img1的权重
    img2:图片对象2
    beta:img1的权重
    gamma:常量值,图像相加后再加上常量值
    dtype:返回图像的数据类型,默认为-1,和img1一样
    (img1alpha+img2beta+gamma)

import numpy as np
from PIL import Image
import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
plt.rc("font", family='Microsoft YaHei')
img1 = Image.open("E:\\3.jpg")
img2 = Image.open("E:\\4.jpg")
img1 = np.array(img1)
img2 = np.array(img2)

# 2 图像混合
img3 = cv.addWeighted(img1,0.7,img2,0.3,0)

# 3 图像显示
plt.figure(figsize=(8,8))
plt.imshow(img3[:,:,::-1])
plt.show()

在这里插入图片描述

  1. 图像位运算
    cv2.btwise_and(): 与运算
    参数:
    img1:图片对象1
    img2:图片对象2
    mask:掩膜

    cv2.bitwise_or():或运算
    参数:
    img1:图片对象1
    img2:图片对象2
    mask:掩膜

    cv2.bitwise_not(): 非运算
    img1:图片对象1
    mask:掩膜

    cv2.bitwise_xor():异或运算,相同为1,不同为0(11=0,10=1)
    img1:图片对象1
    img2:图片对象2
    mask:掩膜

如何得到下方的效果:(接下来讲解步骤,详细代码请下滑)
在这里插入图片描述
第一步,截取操作区域

img1 = cv.imread(r"E:\4.jpg")
# 读取前景的行数与列数
rows,cols = img1.shape[0:2]
#读取背景
img2 = cv.imread(r"E:\1.jpg")
#roi中存放的为背景分割出的与前景同行同列大小的图片,从[0,0]开始
roi = img2[0:rows,0:cols]

在这里插入图片描述
第二步,使用cv2.cvtColor()函数将图片转成灰度图

#是RGB到gray进行颜色转换
img1_gray = cv.cvtColor(img1,cv.COLOR_BGR2GRAY)

在这里插入图片描述
第三步,使用二值化函数cv2.threshold()将灰度图二值化

图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。
把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。
如此处阈值为200,即小于200设置为0,大于200设置为255

#threshold()函数形式:retval,dst = cv2.threshold(src,thresh,maxval,type)
#retval:阈值(临界值)、dst:处理后的图像、src:需要处理的图像、thresh:阈值
#maxval:最大像素值、type:阈值分割类型
ret,img1_thres = cv.threshold(img1_gray,200,255,cv.THRESH_BINARY)

在这里插入图片描述
第四步,使用“非”操作函数cv2.bitwise_not()将上图颠倒黑白:

img1_thres_inv = cv.bitwise_not(img1_thres)

在这里插入图片描述
第五步,使用“与”操作函数cv2.bitwise_and()对图像掩膜(遮挡)

# 对操作区域掩膜
roi_bg = cv.add(roi,roi,mask=img1_thres_inv) 

在这里插入图片描述

#对img1掩膜
#用灰度图做掩膜,img1与img1相加后,与淹没与运算可以达到掩盖部分区域的目的。去黑留白
img1_fg =cv.add(img1,img1,mask=img1_thres)

在这里插入图片描述

掩膜(mask):以图和掩膜的与运算为例:
原图中的每个像素和掩膜中的每个对应像素进行与运算。比如1 & 1 = 1;1 & 0 = 0;
比如一个3 * 3的图像与3 * 3的掩膜进行运算,得到的结果图像就是:在这里插入图片描述

第六步,使用cv2.add()函数将上面两图混合(相加)

# 背景和前景相加
img_add = cv.add(img1_fg,roi_bg)    

在这里插入图片描述
第七步,覆盖操作区域,得到最终结果

img2[0:rows,0:cols] = img_add

在这里插入图片描述
完整代码

#coding:utf-8
import cv2 as cv
import matplotlib.pyplot as plt
# 读取前景
img1 = cv.imread(r"E:\4.jpg")
# 读取前景的行数与列数
rows,cols = img1.shape[0:2]
# 读取背景
img2 = cv.imread(r"E:\1.jpg")
# roi中存放的为背景分割出的与前景同行同列大小的图片,从[0,0]开始
roi = img2[0:rows,0:cols]
# 是RGB到gray进行颜色转换
img1_gray = cv.cvtColor(img1,cv.COLOR_BGR2GRAY)
# threshold()函数形式:retval,dst = cv2.threshold(src,thresh,maxval,type)
# retval:阈值(临界值)、dst:处理后的图像、src:需要处理的图像、thresh:阈值
# maxval:最大像素值、type:阈值分割类型
ret,img1_thres = cv.threshold(img1_gray,200,255,cv.THRESH_BINARY)
# 用灰度图做掩膜,img1与img1相加后,与淹没与运算可以达到掩盖部分区域的目的。去黑留白
img1_fg =cv.add(img1,img1,mask=img1_thres)
# bitwise_not的作用是取反操作
img1_thres_inv = cv.bitwise_not(img1_thres)
# 拿到roi图案的背景,对操作区域掩膜
roi_bg = cv.add(roi,roi,mask=img1_thres_inv)
# 背景和前景相加
img_add = cv.add(img1_fg,roi_bg)   
# 覆盖操作区域  
img2[0:rows,0:cols] = img_add
# 输出图像
cv.imshow("gray",img1_gray)
cv.imshow("thres",img1_thres)
cv.imshow("fg",img1_fg)
cv.imshow("tinv",img1_thres_inv)
cv.imshow("roi_bg",roi_bg)
cv.imshow("img_add",img_add)
cv.imshow("img2",img2)
cv.waitKey(0)
cv.destroyAllWindows()

七、图像颜色空间转换,绑定trackbar到图像,中值滤波和性能评价

  1. 图像颜色空间转换:cv2.cvtColor(img,code)
    参数:
    img: 图像对象
    code:
    cv2.COLOR_RGB2GRAY: RGB转换到灰度模式
    cv2.COLOR_RGB2HSV: RGB转换到HSV模式(hue,saturation,Value)
import cv2 as cv
img1 = cv.imread(r"E:\3.jpg")
img2=cv.cvtColor(img1,cv.COLOR_RGB2GRAY)
cv.imshow("1",img1)
cv.imshow("2",img2)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

import cv2 as cv
img1 = cv.imread(r"E:\3.jpg")
img2=cv.cvtColor(img1,cv.COLOR_RGB2HSV)
cv.imshow("1",img1)
cv.imshow("2",img2)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

  1. 实现二值化:cv2.inRange(img,lowerb,upperb)
    参数:
    img: 图像对象/array
    lowerb: 低边界array, 如lower_blue = np.array([110,50,50])
    upperb:高边界array, 如 upper_blue = np.array([130,255,255])

cv2.inRange()函数可针对多通道实行二值化,主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于双阈值化操作。

import cv2 as cv
import numpy as np
img1 = cv.imread(r"E:\3.jpg")
img2 = cv.inRange(img1,np.array([50,50,50]),np.array([130,255,255]))
cv.imshow("1",img1)
cv.imshow("2",img2)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

  1. 性能评价
    cv2.getTickCount():获得时钟次数
    cv2.getTickFrequency():获得时钟频率(每秒振动次数)
import cv2 as cv
img1 = cv.imread(r"E:\1.jpg")
# e1表示从一个特定的事件(开机的时刻)以后到调用此方法时刻之间的时间周期数
e1=cv.getTickCount()
# for i in range(1,5,2)表示将起始值为1,步长为2,不包含5
for i in range(5,49,2):
    img2=cv.medianBlur(img1,i)
# e2表示从特定事件到调用此方法时刻之间的时间周期数
e2=cv.getTickCount()
# e2-e1则表示调用两个方法之间的时间周期数,用时间周期数/这段时间内的频率=这段时间
# t代表运行处理图片时间,t越小表示处理越快
t=(e2-e1)/cv.getTickFrequency()
print(t)

表示处理这张图片用了2.314秒
在这里插入图片描述

  1. 中值滤波:cv2.medianBlur(src, dst, kszie)
    参数:
    src:输入图像,Mat类的对象。该函数对通道是独立处理的,且可以处理1、3或4得到的Mat图像,但是待处理的图像深度应该是CV_8U,CV_16U,CV_32F,但是对于较大孔径尺寸的图像,只能是CV_8U。
    dst:OutputArray类型的dst,目标图像,需要和输入图像有相同的尺寸和类型。
    ksize:int类型ksize,孔径的线型尺寸,必须是大于1的奇数。

中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 。与邻域平均法类似,但计算的是中值
函数使用中值滤波来平滑(模糊)处理一张图像

import cv2 as cv
img1 = cv.imread(r"E:\1.jpg")
img2=cv.medianBlur(img1,7)
cv.imshow('1',img1)
cv.imshow('2',img2)
k=cv.waitKey(0)

使用中值滤波前img1
在这里插入图片描述

使用中值滤波后img2(图像变得模糊)
在这里插入图片描述

  1. 绑定trackbar到图像-为窗口添加trackbar:cv2.createTrackbar(trackbarname,winname,value,count,onChange)
    参数:
    trackbarname: trackbar(轨迹栏)的名字
    winname: 所属窗口的名字
    value: trackbar创建时的值,即默认值
    count:trackbar能设置的最大值
    onChange:trackbar值发生变化时的回调函数,trackbar的值作为参数传给onchange

  2. 绑定trackbar到图像-获取某个窗口中trackbar的值:cv2.getTrackbarPos(trackbarname,winname)
    参数:
    trackbarname: trackbar的名字
    winname: 窗口的名字

举例:通过改变trackbar的值,来寻找最优mask范围,从而识别出图片中的蓝色五角星

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

# 自定义函数
# def 函数名(变量):
# 语句块
# 函数名(变量) #调用函数
# 创建回调函数
def nothing(args):
    # python中pass的使用:
    # 在python中有时候能看到定义一个def函数,函数内容部分填写为pass。
    # 这里的pass主要作用就是占据位置,让代码整体完整。如果定义一个函数里面为空,
    # 那么就会报错,当你还没想清楚函数内部内容,就可以用pass来进行填坑。
    pass

img = cv.imread("e:\\5.jpg")
img_hsv = cv.cvtColor(img, cv.COLOR_RGB2HSV)
cv.namedWindow("tracks")
# 创建改变颜色的滑动条
cv.createTrackbar("LH", "tracks", 0, 255, nothing)
cv.createTrackbar("LS", "tracks", 0, 255, nothing)
cv.createTrackbar("LV", "tracks", 0, 255, nothing)
cv.createTrackbar("UH", "tracks", 255, 255, nothing)
cv.createTrackbar("US", "tracks", 255, 255, nothing)
cv.createTrackbar("UV", "tracks", 255, 255, nothing)

while (1):
    # 获取八个滑动条的位置
    l_h = cv.getTrackbarPos("LH", "tracks")
    l_s = cv.getTrackbarPos("LS", "tracks")
    l_v = cv.getTrackbarPos("LV", "tracks")
    u_h = cv.getTrackbarPos("UH", "tracks")
    u_s = cv.getTrackbarPos("US", "tracks")
    u_v = cv.getTrackbarPos("UV", "tracks")

    lower_b = np.array([l_h, l_s, l_v])
    upper_b = np.array([u_h, u_s, u_v])
    mask = cv.inRange(img_hsv, lower_b, upper_b)
    res = cv.add(img, img, mask=mask)

    cv.imshow("img", img)
    cv.imshow("mask", mask)
    cv.imshow("res", res)
    k = cv.waitKey(1)
    if k == 27:
        break

cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

八、图像阈值化

  1. cv2.threshold(img,thresh,maxval,type)
    参数:
    img:图像对象,必须是灰度图
    thresh:阈值
    maxval:最大值
    type:
    cv2.THRESH_BINARY: 小于阈值的像素置为0,大于阈值的置为maxval
    cv2.THRESH_BINARY_INV: 小于阈值的像素置为maxval,大于阈值的置为0
    cv2.THRESH_TRUNC: 小于阈值的像素不变,大于阈值的置为thresh
    cv2.THRESH_TOZERO 小于阈值的像素置0,大于阈值的不变
    cv2.THRESH_TOZERO_INV 小于阈值的不变,大于阈值的像素置0
    返回两个值
    ret:阈值
    img:阈值化处理后的图像

cv2.threshold(img,thresh,maxval,type):将一个灰色的图片,变成要么是白色要么就是黑色。(大于规定thresh值就是设置的最大值(常为255,也就是白色))

  1. cv2.adaptiveThreshold(img,maxValue,adaptiveMethod,threshType,blocksize,C)
    参数:
    img: 图像对象,8-bit单通道图
    maxValue:最大值
    adaptiveMethod: 自适应方法
    cv2.ADAPTIVE_THRESH_MEAN_C :阈值为周围像素的平均值
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C : 阈值为周围像素的高斯均值(按权重)
    threshType:
    cv2.THRESH_BINARY: 小于阈值的像素置为0,大于阈值的置为maxValuel
    cv2.THRESH_BINARY_INV: 小于阈值的像素置为maxValue,大于阈值的置为0
    blocksize: 计算阈值时,自适应的窗口大小,必须为奇数 (如3:表示附近3个像素范围内的像素点,进行计算阈值)
    C: 常数值,通过自适应方法计算的值,减去该常数值

cv2.adaptiveThreshold:把图片每个像素点作为中心取N*N的区域,然后计算这个区域的阈值,来决定这个像素点变0还是变255

#coding:utf-8
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread(r"e:\1.jpg",0)
# 图像的二值化
# 小于127的灰度值设置为0,大于127,小于255的灰度值设置为255.
ret,thre1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
# 将图片每个像素点作为中心,取7*7的区域,计算该区域的阈值,每个区域计算出的阈值的基础上在减去2作为这个区域的最终
# 阈值,通过ADAPTIVE_THRESH_MEAN_C算法,将满足条件的像素值变为255.
adaptive_thre1 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,7,2)
# 同理,不过使用的是ADAPTIVE_THRESH_GAUSSIAN_C算法
adaptive_thre2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,7,2)

titles = ["img","thre1","adaptive_thre1","adaptive_thre2"]
imgs = [img,thre1,adaptive_thre1,adaptive_thre2 ]

for i in range(4):
    plt.subplot(2,2,i+1), plt.imshow(imgs[i],"gray")
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述

  1. 奥斯二值化

对于一些双峰图像,奥斯二值化能找到两峰之间的像素值作为阈值,并将其返回。适用于双峰图像的阈值化,或者通过去噪而产生的双峰图像。
注: 双峰图像,顾名思义,灰度级直方图呈明显的双峰状的图像

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('e:\\1.jpg',0)

# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# plot all the images and their histograms
images = [img, 0, th1,
          img, 0, th2,
          blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
          'Original Noisy Image','Histogram',"Otsu's Thresholding",
          'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]

for i in range(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

九、图像形状变换

  1. 图像缩放:cv2.resize(src,dsize,fx,fy,interpolation)
    参数:
    src: 输入图像对象
    dsize:输出矩阵/图像的大小,为0时计算方式如下:dsize = Size(round(fxsrc.cols),round(fysrc.rows))
    fx: 水平轴的缩放因子,为0时计算方式: (double)dsize.width/src.cols
    fy: 垂直轴的缩放因子,为0时计算方式: (double)dsize.heigh/src.rows
    interpolation:插值算法

cv2.INTER_NEAREST : 最近邻插值法
cv2.INTER_LINEAR 默认值,双线性插值法
cv2.INTER_AREA 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image
decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
cv2.INTER_CUBIC 基于4x4像素邻域的3次插值法
cv2.INTER_LANCZOS4 基于8x8像素邻域的Lanczos插值

import cv2
img = cv2.imread(r'e:\3.jpg')
# 水平轴与垂直轴各放大两倍
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

# OR第二种表示方法
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

cv2.imshow("1",img)
cv2.imshow("2",res)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

  1. 仿射变换:cv2.warpAffine(img,M,dsize,flags,borderMode,borderValue)
    参数:
    img: 图像对象
    M:23 transformation matrix (转变矩阵)
    dsize:输出矩阵的大小,注意格式为(cols,rows) 即width对应cols,height对应rows
    flags:可选,插值算法标识符,有默认值INTER_LINEAR,
    如果插值算法为WARP_INVERSE_MAP, warpAffine函数使用如下矩阵进行图像转dst(x,y)=src(M11
    x+M12y+M13,M21x+M22*y+M23)
    borderMode:可选, 边界像素模式,有默认值BORDER_CONSTANT
    borderValue:可选,边界取值,有默认值Scalar()即0
    在这里插入图片描述

仿射变换的M表示平移,缩放,翻转,旋转和剪切的一系列操作。如9.4

在这里插入图片描述

import cv2
import numpy as np

img = cv2.imread(r'e:\3.jpg')
height, width = img.shape[:2]

# 在原图像和目标图像上各选择三个点
mat_src = np.float32([[0, 0],[0, height-1],[width-1, 0]])
mat_dst = np.float32([[0, 0],[100, height-100],[width-100, 100]])

# 得到变换矩阵
mat_trans = cv2.getAffineTransform(mat_src, mat_dst)
# 进行仿射变换
dst = cv2.warpAffine(img, mat_trans, (width,height))

# 显示
imgs = np.hstack([img,dst])
cv2.namedWindow('imgs', cv2.WINDOW_NORMAL)
cv2.imshow("imgs",imgs)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

  1. 平移变换
    在这里插入图片描述
import cv2
import numpy as np

img = cv2.imread(r'e:\3.jpg')
rows,cols = img.shape[:2]

M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)

在这里插入图片描述

  1. 旋转变换:getRotationMatrix2D(center,angle,scale)
    在这里插入图片描述
import cv2

img = cv2.imread(r'e:\3.jpg')
rows,cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)

在这里插入图片描述

  1. 仿射变换矩阵的计算
import cv2
import numpy as np

img = cv2.imread(r'e:\3.jpg')
rows,cols,ch = img.shape

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow("1",img)
cv2.imshow("2",dst)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

  1. 透视变换:cv2.warpPerspective(src,M,dsize,flags,borderMode,borderValue)
    参数:
    src: 图像对象
    M:33 transformation matrix (转变矩阵)
    dsize:输出矩阵的大小,注意格式为(cols,rows) 即width对应cols,height对应rows
    flags:可选,插值算法标识符,有默认值INTER_LINEAR,
    如果插值算法为WARP_INVERSE_MAP, warpAffine函数使用如下矩阵进行图像转dst(x,y)=src(M11
    x+M12y+M13,M21x+M22*y+M23)
    borderMode:可选, 边界像素模式,有默认值BORDER_CONSTANT
    borderValue:可选,边界取值,有默认值Scalar()即0

仿射变换都是在二维空间的变换,透视变换(投影变换)是在三维空间中发生了旋转。需要前后四组坐标来计算对应的转变矩阵

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'e:\3.jpg')
rows,cols,ch = img.shape

b,g,r=cv2.split(img)
img=cv2.merge([r,g,b])

pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])

M = cv2.getPerspectiveTransform(pts1,pts2)

dst = cv2.warpPerspective(img,M,(300,300))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

在这里插入图片描述
在这里插入图片描述

  1. 透视变换:cv2.getPerspectiveTransform(src,dst)
    参数:
    src:原图像中的四组坐标,如 np.float32([[56,65],[368,52],[28,387],[389,390]])
    dst: 转换后的对应四组坐标,如np.float32([[0,0],[300,0],[0,300],[300,300]])
Python OpenCV 基础教程 Python OpenCV基础教程 文章目录Python `OpenCV`基础教程1. 简介2. 安装3. 使用3.1 图像操作:加载,显示,保存3.1.1 读入图像:`cv2.imread()`3.1.2 显示图像:`cv2.imshow()`3.1.2.1 `cv2.waitKey()` 键盘绑定参数3.1.2.2 `cv2.destroyAllWindow()` :删除所有的窗口3.1.3 ... 阅读详情

相关推荐

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景,同时使用 OpenCV-Python 实战讲解图像处理基础要点。

盼小辉丶的博客 27万+

cv2.imread的用法

cv2.imread的用法 使用函数cv2.imread(filepath,flags)读入一幅图片 filepath:要读入图片的完整路径 flags:读入图片的标志 cv2.imread()函数默认读取的是一幅彩色图片 cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道 cv2.IMREAD_GRAYSCALE:读入灰度图片 cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道 图像模式: 1、位图模式 位图模式是1位深度的图像。它只是黑和白两种颜色。

weixin_43570470的博客 1万+

OpenCV-Python实战(13)——OpenCV与机器学习的碰撞

机器学习是人工智能的子集,它为计算机以及其它具有计算能力的系统提供自动预测或决策的能力,诸如虚拟助理、车牌识别系统、智能推荐系统等机器学习应用程序给我们的日常生活带来了便捷的体验。机器学习的蓬勃发展,得益于以下三个关键因素:1) 海量数据集;2) 算法的快速发展;3) 计算机硬件的发展。在本文中,我们将学习 OpenCV 提供的常见机器学习算法和技术,用于解决计算机视觉项目中的实际问题,例如分类和回归问题。

盼小辉丶的博客 2万+

opencv-python

基本操作 每个像素点值在0-255之间,值越小越黑,越大越白 opencv读取格式是BGR cv2.IMREAD_COLOR 彩色图像 cv2.IMREAD_GRAYSCALE 灰色图像 图片读取 cv2.imread(‘cat.png’,cv2.IMREAD_COLOR) 读取数据,彩色数据 cv2.imread(‘cat.png’,cv2.IMREAD_GRAYSCALE) 读取数据并转换成灰度图 视频读取 cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。 如果是视频

weixin_44337883的博客 1749

Python从0到100(六十三):Python OpenCV-入门基础知识

OpenCV是计算机视觉中经典的专用库,其支持多语言、跨平台,功能强大。OpenCV-Python为OpenCV提供了Python接口,使得使用者在Python中能够调用C/C++,在保证易读性和运行效率的前提下,实现所需的功能。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 3万+

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1299

OpenCV 读取图片使用cv2.imread 并显示图片

OpenCV 读取图片使用cv2.imread 并显示图片 OpenCV读取图片的主要函数是cv2.imread, 有三种读取方式: cv2.imread(image path, cv2.IMREAD_COLOR): 这种是加载彩色图片,也可以写成: cv2.imread(image path,1) cv2.imread(image path, cv2.IMREAD_GRAYSCALE):直接读取成为灰度图片,也可以写成 cv2.imread(image path,0) cv2.imread(i

Miniebin的博客 8997

多视图学习 (Multi-View Learning)

多视角/多视图学习(Multi-view learning)是陶大成提出的一个研究方向。我们都知道,在机器学习中样本可以用不同的特征(如图片可以用LBP、SIFT等特征)来表示,或者从不同的角度进行观察(如从前后左右观察一个对象),甚至是采用不同的传感器来观测(如RGB摄像头,Depth摄像头),这些不同的观测手段、角度或特征在多视角学习中称为“视角”。多视角学习通过对不同的视角进行统一分析和研究,希望能够得到更好的分类或聚类等等的效果。

CarpeDiem 3万+

cv2.imread()参数的含义

cv2.imread()参数的含义

zy的博客 2045

PacketTacer烟雾传感器读数为0的解决方法

PacketTacer烟雾传感器读数为0的解决方法

ChloeMax_的博客 1902

嵌入式工程师必学(118):MCU的硬件定时器和中断

大多数微处理器都有一个或多个可编程硬件定时器,这些定时器包括对中断的支持。可以有不同类型的计时器,用于不同的应用程序。例如,LPC1768 具有四个 32 位通用定时器、一个看门狗定时器、一个重复中断定时器、一个系统滴答定时器、一个正交编码器接口、6 个 PWM 输出和一个支持中断的实时时钟。硬件定时器用于计时和计数作,允许处理器在 timer 进程运行时继续执行其他进程。硬件定时器是一种使用 clock 信号来增加 register 的电路。

码农17年的博客 211

CV2逐步学习-1.imread()详解+cvtColor()颜色空间转换

1.cv2.imread(filename, flags) 参数: filepath:读入imge的完整路径 flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED} cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代 cv2.IMREAD_GRAYSCALE:读入灰度图片,可用0作为实参替代 cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通

sunjintaoxxx的博客 1万+

闲鱼爬虫实战:模拟手机端破解反爬策略,爬取指定商品搜索数据,爬取闲鱼搜索指定商品(需手机端模拟)o 技术点:抓包分析、cookie与token

技术点作用抓取手机 App 请求,分析 API 结构、Header、参数加密情况requestsPython 中最常用的 HTTP 库,用于发送模拟请求Session 对象自动管理 Cookie,保持会话User-Agent & 设备特征模拟手机型号、系统版本,绕过服务端检测闲鱼部分接口存在签名,需要逆向或复用有效 Token多线程/异步提高爬取效率(需节制,避免封 IP)解析 HTML 或 JSON 数据注意:闲鱼的接口加密程度中等偏上,部分接口存在动态签名(如x-signx-mini-wua。

2201_76125261的博客 712

OpenCV-Python学习基础知识(1)

参考学习:OpenCV-Python学习—基础知识 test1 import cv2 import matplotlib.pyplot as plt ''' opencv是一个强大的图像处理和计算机视觉库 opencv采用BGR模式,而不是RGB ''' img = cv2.imread(r'../Figure/obama.jpg', 1) ''' imread(img_path,flag) 读取图片,返回图片对象 img_path: 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为No

林海 286

【UVM实战】第一章:配置UVM环境(以VCS为例),跑通书上的例子(包括清理中间文件方法、使用DVE查看波形方法、命令执行原理探究)

如何配置UVM的VCS运行环境,运行书本上的例子呢?本节将会为你详细解答!

悟已往之不谏 知来者之可追 8131

【OpenClaw从入门到精通】第45篇:Skill供应链安全——如何识别并避开恶意技能插件?(2026实测版)

随着OpenClaw生态爆发式增长,全球Skills总量近75万个,日均新增2.1万个,但恶意/问题插件已超600个,数十万用户受影响。本文基于奇安信威胁报告及360安全实践,拆解恶意技能的五大核心特征,提出"安装前三步法"安全审查流程,详解安全技能来源白名单与定期审计方案,并深度解析360龙虾Skill安全超市的分级认证机制。读者可掌握从技能筛选、安装审查到术后审计的全流程安全防护手段,通过实操命令与案例演示,零成本构建Skill供应链安全防线,避免遭遇私钥窃取、资产损失等安全事件。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 561

opencv-python图形图像处理入门基础知识

本文详细介绍了opencv-python的安装、加载图像文件、捕获摄像头、显示图像、鼠标事件捕获、键盘事件处理、几何图像绘制、颜色空间转换、图像阈值处理、图像修复等基础知识,适合开始学习opencv-python的初学者。

老猿Python 9781

OPTEE:TA命令操作的实现(三)

上文我们创建好了通道,现在就是操作,怎么操作TA呢?REE侧的CA执行创建会话操作成功后,CA就可使用获取到的调用来让TA执行特定的命令。通过ioctl的系统调用发送到OP-TEE的驱动中,保存在共享内存中,并触发安全监控模式调用(smc)切换到Monitor模式(ARMv7)或EL3(ARMv8)中进行安全世界状态的处理。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1267

opencv-python基础知识学习笔记

opencv-python基础知识学习笔记 原博地址:https://www.cnblogs.com/silence-cho/p/10926248.html 1.图像的读入和存储: (1)函数格式: #【1】读取图片,返回图片对象 imread(img_path,flag) img_path: 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None flag:cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1 ...

weixin_39504171的博客 1126

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OpenCV-Python学习基础知识!

通过上述的平移,缩放,旋转的组合变换即实现了仿射变换,上述多个变换的变换矩阵相乘即能得到组合变换的变换矩阵。通过上述的平移,缩放,旋转的组合变换即实现了仿射变换,上述多个变换的变换矩阵相乘即能得到组合变换的变换矩阵。从上图中可以透视变换的一个应用,如果能找到原图中纸张的四个顶点,将其转换到新图中纸张的四个顶点,能将歪斜的roi区域转正,并进行放大;从上图中可以透视变换的一个应用,如果能找到原图中纸张的四个顶点,将其转换到新图中纸张的四个顶点,能将歪斜的roi区域转正,并进行放大;

Python_trys的博客 2414

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OpenCV-Python学习—基础知识

(一)OpenCV-Python学习—基础知识 原文:https://www.cnblogs.com/silence-cho/p/10926248.html opencv是一个强大的图像处理和计算机视觉库,实现了很多实用算法,值得学习和深究下。 1.opencv包安装 ·  这里直接安装opencv-python包(非官方): pip install opencv-python    官方文档:https://opencv-python-tutroals.readthedocs.io/en/lat

jgw2008的专栏 702

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

opencv--day01--opencv基础知识及基础操作

摘要: 本文介绍了OpenCV的基础知识及其在Python中的应用。OpenCV是一个开源的计算机视觉库,支持多平台和语言,功能涵盖图像处理、物体识别、机器学习等。Python通过opencv-python模块调用OpenCV,结合Numpy实现高效图像处理。文章详细讲解了图像表示(像素、RGB通道)、存储方式(Numpy数组)以及基本操作(读取、显示、保存图像),并演示了创建黑白图和随机彩图的代码示例。学习OpenCV前需掌握Numpy相关知识,这为后续计算机视觉开发奠定基础。

2303_78278237的博客 1393

树莓派3b+ 编译安装OpenCV4.1.0+opencv_contrib-4.1.0

买了个树莓派3b+,因为做图像,想在树莓派上安装个OpenCV,现在OpenCV都更新到OpenCV4.1.0了,据说在深度学习方面有了更多的改进,那就安装个最新版本吧。 关于树莓派烧录系统(2019-04-08-raspbian-stretch),更改源等步骤本文不再赘述。OpenCV4.1.0和opencv_contrib-4.1.0的安装包大家可从GitHub上搜索下载,...

Jun先生的博客 7526

OpenCV - Python基础知识运用

OpenCV基础知识小总结

m0_73939403的博客 1589

Opencv学习笔记之OpenCV介绍

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类,同时提供了Python、Ruby、MATLAB等语言的接口,实现了和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。

浩瀚之水的专栏 4527

OpenCV基础知识

1.OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时。3.opencv重要性。

m0_73723097的博客 1万+
上一篇: Matplotlib绘图时,无法显示中文
下一篇: img.shape[:2]的意思
LoriaLi
博客等级 码龄8年 16粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值