栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

OpenCV读书笔记之二-- 核心操作

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenCV读书笔记之二-- 核心操作

核心操作

整体分为三大模块

一、图像的基本操作 1、访问和修改像素
#加载彩色图像
import numpy as np
import cv2 as cv
img = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
#可以通过行列坐标来访问像素值,对于BGR图像,返回红蓝绿组成的数组,对于灰色图像,返回相应的回复
px = img[100,100]
print(px)
#仅访问蓝色像素
blue =img[100,100,0]
print(blue)
#使用相同的方法修改像素值
img[100,100]=[255,255,255]
print(img[100,100])

备注:numpy的是用于快速数组计算的优化库,因此,简单的访问每个像素值并对其进行修改是非常缓慢的,不建议使用。

#更好的访问像素和编辑方法
img.item(10,10,2)
#修改RED值
img.itemset((10,10,2),100)
2、访问图像属性

属性包括行数、列数和通道数,图像数据类型,像素数;

#图像的形状
print(img.shape)
#像素总数
print(img.size)
#图像的数据类型
print(img.dtype)
3、图像感兴趣区域ROI

感兴趣区域即对数据进行切片处理

ball = img[280:340,330:390]
img[280:340,330:390]=ball
4、拆分和合并图像通道
#拆分图像通道
b,g,r = cv.split(img)
#合并图像通道
img = cv.merge((b,g,r))
#将所有的红色像素数据设为0,则无需先拆分通道
b = img [:, :, 0]
img [:, :, 2] = 0
5、为图像设置边框(填充)

使用cv.copyMakeBorder()在图像周围创建边框,他在卷积计算,零填充等方面更有用,函数参数:
1、src:输入图像
2、top、bottom、left、right边界宽度
3、borderType:定义添加边框的类型

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
BLUE =[255,0,0]
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP)
constant = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_CONSTANT,value=BLUE)
plt.subplot(231)
plt.imshow(img1,'gray')
plt.title('original')
plt.subplot(232)
plt.imshow(replicate,'gray')
plt.title('replicate')
plt.subplot(233)
plt.imshow(reflect,'gray')
plt.title('reflect')
plt.subplot(234)
plt.imshow(reflect101,'gray')
plt.title('reflect101')
plt.subplot(235)
plt.imshow(wrap,'gray')
plt.title('wrap')
plt.subplot(236)
plt.imshow(constant,'gray')
plt.title('constant')
二、图像的算法运算 1、图像加法

可以通过opencv的cv.add()或者numpy操作res=img1+img2添加两个图像,两个图像有相同的深度和类型,或者第二个图像是一个标量.

x = np.uint8([250])
y = np.uint8([10])
print(x+y)  #4
print(cv.add(x,y))  #255
2、图像融合
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
img2 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
3、按位运算

包括按位 AND、 OR、NOT 和 XOR 操作,改变图像的特定区域

#加载两张图片
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
img2 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
#我想把图像放在左上角,所以我创建了ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
#现在创建图像的掩码,并同时创建其相反掩码
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray,10,255,cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
#现在将ROI中的logo的区域涂黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将logo放入ROI并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()
三、性能衡量和提升技术

opencv通过cv.getTickCount,在执行函数之前和执行函数之后调用,可以获取执行函数的时间,cv.getTickFrequency等函数来提升代码的性能,除opencv之外,python 的time模块可执行代码时间,另外一个profile模块获取代码的详细报告,比如每个函数花费了多少时间,调用函数的次数等;

#代码的运行时间
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
e1 = cv.getTickCount()
for i in range(5,49,2):
    img1 = cv.medianBlur(img1,i)
e2 = cv.getTickCount()
time = (e2-e1)/cv.getTickFrequency()
print(time)

#检测是否启动了优化

#检查是否使用了优化
cv.useOptimized()
%timeit res = cv.medianBlur(img,49)
#关掉优化器
cv.setUseOptimized(False)
cv.useOptimized()
%timeit res = cv.medianBlur(img,49)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921196.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号