opencv-python图像处理笔记《二》:图片基本处理方法

opencv-python图像基本处理方法


前言

图像基本的处理就是针对读取到的图片数据做像素级别上的分割,数学运算等操作。


以下是本篇文章正文内容,下面案例可供参考

一、利用opencv读取和显示图片

1.读取图片

# 导入opencv库
import cv2

# 图像存储位置
src = 'lena.png'
# 图像读取   图像存储链接-->mat
img = cv2.imread(src)

此处的img即为图片数据。

2.显示图片

计算机上显示图片主要由三种方式
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,利用其他方式展示图像时得对数据进行调整,否则无法正确展示图像。

二、数据基本处理

1.通道分割和融合

对三通道图像分割代码如下:

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()

得到如下显示图像:
融合通道后的图像

2.感兴区域ROI

对于一个图片来说,我们做图像处理,我们是针对图像中的部分数据进行处理,我们可以获得我们感兴趣的区域,然后进行其他相关操作。

获取脸部代码如下:

# h上从200-380 ,w从200-360,三个通道全选
roi = img[200:380,200:360,:]
cv2.imshow('roi',roi)
cv2.waitKey(0)
cv2.destroyAllWindows()

脸部
原图像大小为(512*512)

3.数据属性

对于读入的图片数据,我们可以获取数据相关属性
代码如下:

# 获取数据类型
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()

生成的图片:
生成图片

4.数学运算

进行运算之前要求两幅图像的大小必须完全一致,类型(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相加得到的图,一般方法相加得到的图:
j加法对比

利用一般方法相加会导致数据溢出,超出了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)   # 逻辑非运算,对一张图像而言,即像素取反

总结

以上就是今天要讲的内容,本文简单介绍了opencv的对于图片数据的基本操作,从这些基本操作进而去实现复杂的算法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值