OpenCv:图像处理基础(一)

本文会告诉大家一些图像处理的基础,包括图像的基本表示方法,图像处理的基础操作,图像运算。色彩空间转换会放到图像处理基础(二)里单独讲。
这里选下面这张图片来为下面的操作进行演示。
在这里插入图片描述

图像的读取与属性信息

读取

使用cv2.imread(filename[, flags])来读取图片。
注意事项:读取的图片名称不能为中文

参数filename是包括了后缀在内的图片路径加名字
flags为读取标记,可以为原图,也可以为灰度等等

在这里插入图片描述

属性信息

imread()读取完事是一堆数组,所以可以直接拿到他们的属性信息。
shape为图像行数,列数,色彩通道数,size是像素点的个数,dtype为图片的数据格式。

示例

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

result = cv2.imread('./Ying.jpg')#读取
print("shape",result.shape,'\nsize',result.size,'\ndtype',result.dtype)

\n是换行符

shape (715, 464, 3)
size 995280
dtype uint8

plt.imshow(result)

在这里插入图片描述

gray = cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)
ret,thresh1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV)
titles = ['gray','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [gray,thresh1,thresh2,thresh3,thresh4,thresh5]
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()
# cv2.THRESH_BINARY(黑白二值)
# cv2.THRESH_BINARY_INV(黑白二值反转)
# cv2.THRESH_TRUNC (得到的图像为多像素值,即大于阈值部分设为阈值,否则不变)
# cv2.THRESH_TOZERO(大于阈值部分不改变,否则设为0)
# cv2.THRESH_TOZERO_INV(上面的反转)

在这里插入图片描述

图像保存

gray是原图片的灰度图片

gray.shape#输出为(715, 464)
cv2.imwrite('C:/Users/Lyb/Desktop/Ying.jpg',gray)#保存成功显示True

在这里插入图片描述

图像通道处理的基本操作

一般图片为三颜色通道,即RGB三颜色通道,但是使用imread()读取的图片通道为B,R,G

titles = ['B','G','R']
for i in range(3):
    plt.subplot(1,3,i+1),plt.imshow(result[:,:,i])
    plt.title(titles[i])
plt.show()

在这里插入图片描述

拆分通道和显示图像

拆分:除了上面的方法可以分离通道,还有cv2.split()可以拆分通道
显示:namedWindow()函数用来创建指定的窗口,格式如下:

None = cv2.namedWindow(window)

window是窗口的名字,句程序会新建一个名字为image的窗口。
imshow()函数用来显示图像,格式如下:

None = cv2.imshow(window, image)

window是窗口的名字。image是要显示的图像。

waitKey()函数用来等待按键,当有键被按下时,该语句会被执行。格式如下:

retval= cv2.waitKey([delay])

retval是返回值。delay表示等待键盘触发的时间,单位是ms。当该值为负数或0时表示无限等待,默认值为0。

destroyAllWindows函数用来释放所有窗口,格式如下:

None = cv2. destroyAllWindows ()
b, g, r = cv2.split(result)
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
cv2.imshow('ying',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
此时程序在运行这里,因为设置的delay为0,按下任意键即可退出。

np.unique(result[:,:,0] == b)#输出为array([ True])

split()分割出来的B通道和imread读取图片的第一个通道是一样的。

合并

通道合并是通道拆分的逆过程,可以将三个通道的灰度图像合并为一张彩色图像。OpenCV中提供了merge()函数来实现图像通道的合并,基本格式为:

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

imagebgr是合并后的图像。b、g、r分别是B通道、G通道、R通道的图像信息。

image_merge = cv2.merge([b,g,r])
plt.imshow(image_merge)

在这里插入图片描述

图像运算

加法运算

运算符“+”

OpenCV中有两种方法可以实现图像的加法运算。一种是通过运算符“+”对图像进行加法运算,另一种是通过cv2.add()函数来实现对图像的加法运算。
因为计算机一般使用8个比特来表示灰度图像,所以像素值的范围是0~255。当像素值的和超过255时,这两种加法方式的处理方法是不一样的。下面进行具体的介绍。
在使用运算符“+”对两个图像的像素进行加法运算时,其具体规则如下:
在这里插入图片描述

上式中,a和b表示两幅图像的像素值,mod(a+b,256) 表示“a+b的和除以256取余”。

#  +
print((g+b).shape)
plt.imshow(g+b)

在这里插入图片描述

cv2.add()函数

在使用cv2.add()函数实现图像加法运算时,其一般格式为:

result = cv2.add(a, b)

result表示计算的结果。a和b表示需要进行加法计算的两个像素值。
使用cv2.add()函数进行图像加法运算时,会得到像素值的最大值。规则如下:
[插图]

上式中,当像素a和像素b的和超过255时,会将其截断,取范围内的最大值,这是与运算符“+”的不同之处。

r1 = cv2.add(g,b)
print(r1.shape)
plt.imshow(r1)

在这里插入图片描述

np.unique(r1 == (g+b))#输出:array([False,  True])

可以直观的看到两种加法是不同的

减法运算

运算符“-”

规则如下:
在这里插入图片描述
上式中,a和b表示两幅图像的像素值,mod(a-b,255)+1表示“a-b的差除以255取余后加1”。

#  -
print((g-b).shape)
plt.imshow(g-b)

在这里插入图片描述

cv2.subtract()函数

在使用cv2. subtract()函数实现图像减法运算时,其一般格式为:

result = cv2. subtract (a, b)

result表示计算的结果。a和b表示需要进行减法计算的两个像素值。
使用cv2. subtract ()函数进行图像减法运算时,规则如下:
在这里插入图片描述
上式中,当像素a和像素b的差值小于0时,会将其截断,这是与运算符“-”的不同之处。

r1 = cv2.subtract(g,b)
print(r1.shape)
plt.imshow(r1)

在这里插入图片描述

乘法运算

图像乘法运算有矩阵乘法和矩阵的点乘两种。Python的OpenCV提供了cv2. mutiply()函数进行矩阵的点乘运算,Python的numpy为矩阵的乘法运算提供了dot()函数。

矩阵乘法

矩阵乘法的一般格式为:

result = np.dot(a, b)

result表示计算的结果。 a和b表示需要进行矩阵乘法计算的两个像素值矩阵。
在进行矩阵乘法运算时必须满足其行列维数的规则。

矩阵的点乘

矩阵点乘运算的一般格式为:

result = cv2.multiply (a, b)

result表示计算的结果。a和b表示需要进行矩阵点乘的两个像素值矩阵。

r1 = cv2.multiply(g,b)
print(r1.shape)
plt.imshow(r1)

在这里插入图片描述
在这里插入图片描述
可以看到,矩阵点乘运算的结果大多是255,这是由于,在结果大于255时,类似于加法运算,计算机会截断数据,取最大值。

除法运算

除法运算应用在图像中即为矩阵的点除运算,Python的OpenCV提供了cv2. divide()函数来进行像素矩阵的点除运算。其一般格式如下:

result = cv2.divide(a, b)

result表示计算的结果。a和b表示需要进行矩阵点除的两个像素值矩阵。

r1 = cv2.divide(g,b)
print(r1.shape)
plt.imshow(r1)

在这里插入图片描述

按位与

按位与:全为真时,结果才为真,反之为假。
在这里插入图片描述

result = cv2.bitwise_and(src1, src2[, mask])

src1表示第一个输入值。 src2表示第二个输入值。mask表示可选操作掩码。下面同理。
首先来构造一个掩模图像。

#按位与
image = np.zeros(b.shape,dtype=np.uint8)#构造一个掩模图像
image[:600,150:] = 255
plt.imshow(image)

在这里插入图片描述
再来计算按位与,来达到“截图”的效果

r1 = cv2.bitwise_and(b,image)
plt.imshow(r1)

在这里插入图片描述

按位或

按位或:有一个为真,即为真。
在这里插入图片描述

result = cv2.bitwise_or(src1, src2[, mask])

#按位或
r1 = cv2.bitwise_or(b,image)
print(r1.shape)#输出为(715, 464)
plt.imshow(r1)

在这里插入图片描述

按位非

按位非是取反操作
在这里插入图片描述

result = cv2.bitwise_not(src[, mask])

#按位非
r1 = cv2.bitwise_not(b)
print(r1.shape)#(715, 464)
plt.subplot(121)
plt.imshow(r1)
plt.title('B_bitwise_not')
plt.subplot(122)
plt.imshow(b)
plt.title('B')

在这里插入图片描述
不太明显,那咱们拿上面的二值图像来操作

r1 = cv2.bitwise_not(thresh1)
plt.subplot(121)
plt.imshow(r1)
plt.title('former_thresh1')
plt.subplot(122)
plt.imshow(thresh1)
plt.title('later_thresh1')

在这里插入图片描述
从图像上可以看出来是像素值全部取反的结果。

按位异或

按位异或操作类似于半加运算
在这里插入图片描述

result = cv2.bitwise_and(src1, src2[, mask])

这里选取的图片是雷神的二值图像,和二值图像的取反,经过按位异或操作应该是一个全为255的矩阵。因为一个是1(255),一个是0,结果为1(255)

#按位异或
r1 = cv2.bitwise_xor(thresh1,thresh2)
print(r1.shape)
plt.imshow(r1)

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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV是一个广泛使用的计算机视觉库,用于图像和视频处理。下面是一些OpenCV图像处理基础知识: 1. 图像加载和显示:使用OpenCV可以加载和显示图像。可以使用`cv2.imread()`函数加载图像,并使用`cv2.imshow()`函数显示图像。 2. 图像保存:使用`cv2.imwrite()`函数可以将图像保存到文件中。 3. 图像通道:彩色图像由三个颜色通道(红色、绿色和蓝色)组成,每个通道都是一个灰度图像。可以使用`cv2.split()`函数将彩色图像拆分成单个通道,并使用`cv2.merge()`函数将单个通道合并成彩色图像。 4. 图像缩放:可以使用`cv2.resize()`函数调整图像的大小。可以指定新的宽度和高度,或者指定缩放因子。 5. 图像旋转:可以使用`cv2.getRotationMatrix2D()`函数获得旋转矩阵,并使用`cv2.warpAffine()`函数对图像进行旋转。 6. 图像平滑:可以使用不同的滤波器对图像进行平滑处理,如均值滤波器、高斯滤波器等。可以使用`cv2.blur()`函数进行均值滤波,使用`cv2.GaussianBlur()`函数进行高斯滤波。 7. 图像边缘检测:可以使用不同的边缘检测算法,如Sobel算子、Canny边缘检测等。可以使用`cv2.Sobel()`函数进行Sobel算子边缘检测,使用`cv2.Canny()`函数进行Canny边缘检测。 8. 图像阈值处理:可以使用不同的阈值处理方法对图像进行二值化处理,如全局阈值、自适应阈值等。可以使用`cv2.threshold()`函数进行全局阈值处理,使用`cv2.adaptiveThreshold()`函数进行自适应阈值处理。 以上是OpenCV图像处理的一些基础知识,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼肝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值