学习笔记 | opencv基础算数操作

本文详细介绍了OpenCV库在图像处理中的基本操作,包括图像的读取、显示和保存,以及绘制几何图形如直线、圆形和矩形。此外,还讲解了如何访问图像像素、获取图像属性、通道分离与合并以及颜色空间转换。在算术操作部分,讨论了图像的加减乘除、混合,并通过实例展示了这些操作的实现。最后,文章通过图像混合展示了不同权重的图像组合效果。
摘要由CSDN通过智能技术生成

一.Opencv基本操作

(1)图像读取保存
1.1读取图像

cv.imread(‘name.jpg’,flag)
flags:读入图片的标志
cv.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可以直接写1
cv.IMREAD_GRAYSCALE:读入灰度图片,可以直接写0
cv.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,可以直接写-1

1.2显示图像

<1>cv.imshow(‘name’,img)
参数:显示图像的窗口名称,字符串类型
要加载的图像
在调用后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像也无法加载出来。cv.waitKey(0):永远的等待下去。
<2>
plt.imshow(img[:,:,::-1]) (原来BGR换成RGB通道,翻转一下)
plt.show()

1.3保存图像

cv.imwrite(‘name.png’,img)
参数:文件名
要保存的图像

(2)绘制几何图形
2.1直线

cv.line(img,start,end,color,thickness)
img:要绘制直线的图像
start,end :直线起始点
color:直线颜色
thickness:线条宽度

2.2 圆形

cv.circle(img,centerpoint,r,color,thickness)

2.3矩形

cv.retangle(img,leftupper,rightdown,color,thickness)

2.4 添加文字

cv.putText(img,text,station,font,fontsize,color,thickness,cv.LINE_AA)

(3)访问图像的像素

通过行列坐标获取,对于BGR图像,返回一个蓝绿红值得数组;对于灰度图像,仅返回相应的强度值。
获取:px = img[100,100]
仅获取蓝色强度值:blue = img[100,100,0]
修改:img[100,100]=[255,255,255]

(4)获取图像属性

形状:img.shape
图像大小:img.size
数据类型:img.dtype

(5)通道的分离和合并

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

(6)颜色空间的变换

cv.cvtColor(input_image, flag)
Flag:转换类型
Cv.COLOR_BGR2GRAY
Cv.COLOR_BGR2HSV

二.算数操作

(1)加减乘除

两图相同大小和类型,或者第二个图像可以是标量值。
cv.add():饱和操作
numpy:res = img1+img2 :模运算

x = np.uint8([250])
y = np.uint8([10])

print(cv.add(x, y))
#[[255]] 250+10=260 ==> 255 (结果更好)

print(x+y)
#[4] 250+10 = 260 % 256 = 4

print(cv.subtract(y, x))
#[[0]] 10-250=-240 <0 ==>0

print(y-x)
#[16] -240 = 256 * 1 +(-16) ==> 16

print(cv.multiply(y, x)) # [[255]]

print(x*y)
#[196] 2500%256 == 196

print(cv.divide(x, y)) # [[25]]

print(x/y) # [25.]

(2)图像混合

两幅图像给予不同权重的混合
g(x) = (1-ɑ) f0(x) +ɑf1(x)
dst = αimg1 + βimg2 + γ
例: 0.7 0.3 0

代码演示

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

# 1读取图像
img = cv.imread("image./sky.jpg")
moppet = cv.imread("image./moppet.jpg")
night = cv.imread("image./night.jpg")

# # 2 显示图像
# # 2.1opencv
# cv.imshow("image", img)
# k = cv.waitKey(0)
# cv.destroyAllWindows()

# #2.2 matplotlib
# #plt.imshow(img[:, :, ::-1])
# plt.imshow(img,cmap=plt.cm.gray)
# plt.title("moon"), plt.xticks([]), plt.yticks([])
# plt.show()

# 3图像保存
# cv.imwrite("messigray.png", img)

# # 4.绘制图形
# img = np.zeros((512, 512, 3), np.uint8)
# # 无符号整型
#
# cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
# cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
# cv.circle(img, (447, 63), 63, (0, 0, 255), -1)
# font = cv.FONT_HERSHEY_SIMPLEX
# cv.putText(img, "opencv", (10, 500), font, 4,(255, 255, 255), 2, cv.LINE_AA)

# plt.imshow(img[:, :, ::-1])
# plt.title("draw"), plt.xticks([]), plt.yticks([])
# plt.show()

# # 5.像素
# img[100, 120] = [255, 255, 255]
# img[100, 121] = [255, 255, 255]
# px = img[100, 100]
# print(px)

# # 6.属性
# print(img.shape)

# # 7.通道拆分与合并
# b, g, r = cv.split(img)
# plt.imshow(b, cmap=plt.cm.gray)
# plt.show()

# img2 = cv.merge((b, g, r))
# plt.imshow(img2[:, :, ::-1])
# plt.show()

# 8.空间转换
# gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# plt.imshow(gray, cmap=plt.cm.gray)
# plt.show()
# hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# plt.imshow(hsv)
# plt.show()

# # +
# img1 = cv.add(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img + night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()

# # -
# img1 = cv.subtract(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img - night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()

# # *
# img1 = cv.multiply(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img * night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()

# img1 = cv.divide(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img / night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()

# x = np.uint8([250])
# y = np.uint8([10])
# print(cv.add(x, y))
# print(x+y)
# print(cv.subtract(y, x))
# print(y-x)
# print(cv.multiply(y, x))
# print(x*y)
# print(cv.divide(x, y))
# print(x/y)


# # 图像混合
# img3 = cv.addWeighted(img, 0.7, moppet, 0.3, 0)
# plt.imshow(img3[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值