图像基本的处理就是针对读取到的图片数据做像素级别上的分割,数学运算等操作。
以下是本篇文章正文内容,下面案例可供参考
# 导入opencv库
import cv2
# 图像存储位置
src = 'lena.png'
# 图像读取 图像存储链接-->mat
img = cv2.imread(src)
此处的img即为图片数据。
计算机上显示图片主要由三种方式
1、opencv
2、matlabplot
3、PIL
利用opencv显示代码如下:
# 导入opencv库
import cv2
# 图像存储位置
src = 'lena.png'
# 图像读取 图像存储链接-->mat
img = cv2.imread(src)
# 图像展示 在窗口'img'中展示图片img
cv2.imshow('img',img)
# 等待按键操作
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
对于opencv打开的图像数据存储为(H,W,C)高、宽和通道数、通道顺序为B,G,R,利用其他方式展示图像时得对数据进行调整,否则无法正确展示图像。
对三通道图像分割代码如下:
B,G,R = cv2.split(img)
B,G,R如果显示,其为单通道图像,呈现灰度图。
图像合并代码如下:
img_m = cv2.merge([R,G,B])
cv2.imshow('bgr2rgb',img_m)
cv2.waitKey(0)
cv2.destroyAllWindows()
对于一个图片来说,我们做图像处理,我们是针对图像中的部分数据进行处理,我们可以获得我们感兴趣的区域,然后进行其他相关操作。
获取脸部代码如下:
# h上从200-380 ,w从200-360,三个通道全选
roi = img[200:380,200:360,:]
cv2.imshow('roi',roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
对于读入的图片数据,我们可以获取数据相关属性
代码如下:
# 获取数据类型
print(type(img))
# 获取数据形状
print(img.shape)
# 获取数据类别
print(img.dtype)
# 获取数据大小
print(img.size)
# 获取指定数据值 h=200,w=200,g通道上的具体数值
print(img[200,200,1])
输出结果:
当知道图片数据是什么的时候,我们自动生成图片。
代码如下:
m = np.random.randint(0,255,(256,256,3),dtype=np.uint8)
for h in range(256):
for w in range(256):
for i in range(256):
m[h,w,0] = h
m[h, w, 1] = w
m[h, w, 2] = i
cv2.imshow('im',m)
cv2.waitKey(0)
cv2.destroyAllWindows()
进行运算之前要求两幅图像的大小必须完全一致,类型(dtype)也要完全一致,他才有可能完成这些运算
算术运算:加、减、乘、除,应用它可以调节亮度跟对比度
逻辑运算:与、或、非,应用它进行遮罩层控制
代码如下:
# 获得两张图片dtype且大小相等的图片
m = cv2.imread('m.png')
lena = cv2.resize(img,(256,256))
# 加法
c_ad = cv2.add(lena,m)
ad = lena+m
lena = np.hstack((lena,lena,m,c_ad,ad))
cv2.imshow('lena',lena)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果对比,下图分别为lena原图、m原图、cv2相加得到的图,一般方法相加得到的图:
利用一般方法相加会导致数据溢出,超出了255,而opencv提供的函数将溢出数据按255处理。而对于乘除法进行归一化处理转到0-255数值中。
# 获得两张图片dtype且大小相等的图片
m = cv2.imread('m.png')
lena = cv2.resize(img,(256,256))
# 加法
c_ad = cv2.add(lena,m)
# 减法
c_sub = cv2.subtract(lena,m)
# 乘法
c_mul = cv2.multiply(m,lena)
# 除法
c_div = cv2.divide(m,lena)
lena = np.hstack((c_sub,c_div,c_mul))
cv2.imshow('lena',lena)
cv2.waitKey(0)
cv2.destroyAllWindows()
dst = cv.bitwise_and(m1, m2) # 逻辑与运算,非零的区域被保留下来了
dst = cv.bitwise_or(m1, m2) # 逻辑或运算,与两张图片相加结果类似
dst = cv.bitwise_not(image) # 逻辑非运算,对一张图像而言,即像素取反