Python3.x+OpenCV3.3

最近把Python的基础语法过完了,现在每天大概花一个半小时做一下Python上OpenCV的基本操作。

一、环境配置

1、安装pip工具

       pip是Python管理包的一个工具,它可以让你很方便的查找、安装、卸载包。通过pip --version可以查看pip的版本。

       使用pip安装包的语法:pip install SomePackage

2、安装opencv-python

       pip install opencv-python

二、OpenCV上的Hello World程序:图像加载、显示、保存

#coding:utf-8
import cv2

image = cv2.imread(".\logo.png", cv2.IMREAD_COLOR)
cv2.imshow("image", image)
#等待用户按键
k = cv2.waitKey(0)
if k == 27:
	cv2.destroyAllWindows()
elif k == ord('s'):
	cv2.imwrite(".\logo_copy.png", image)
	cv2.destroyAllWindows()

三、操作图像像素

      仅仅使用OpenCV也可以访问到图像的像素,但是效率会很低,不建议这样做。一般会使用NumPy库,它是Python语言的一个扩展库,支持大量的维度运算和矩阵运算,是为了进行快速矩阵运算而优化的库。

#coding:utf-8
import numpy as np 
import cv2

#参数0---灰度图,1---彩色图,-1---alpha图
image = cv2.imread(".\cat.jpg", 1)
cv2.imshow("img1", image)

#使用 属性shape 打印图像的行数、列数、通道数
#如果是灰度图,则只打印行数、列数
#print(image.shape)
rows = image.shape[0]
cols = image.shape[1]
channel = 1
print(len(image.shape))
if len(image.shape) == 3:
	channel = 3

#使用 属性size 打印图像的总位数:行数*列数*通道数
print(image.size)

#属性 属性dtype 打印图像的数据类型
print(image.dtype)

#遍历图像,并提高图像整体的亮度
for i in range(0, rows):
	for j in range(0, cols):
		#如果是彩色图
		if channel == 3:
			for c in range(0, 3):
				image[i][j][c] = (image[i][j][c] - int(image[i][j][c] / 2))

		else:
			image[i][j] = (image[i][j] - int(image[i][j] / 2))

cv2.imshow("img2", image)
cv2.waitKey(0)


运行结果:

四、获取图像感兴趣的区域

      NumPy支持指定行的范围和列的范围就能够获得感兴趣区域。比如:image[30:100, 30:100]表示的是图像30-100行、30-100列的区域。

#coding:utf-8
import numpy as np 
import cv2

#参数0---灰度图,1---彩色图,-1---alpha图
image = cv2.imread(".\cat.jpg", 1)
cv2.imshow("img1", image)

image_roi = image[30:100, 30:100]
image[100:170, 100:170] = image_roi

cv2.imshow("img2", image)
cv2.waitKey(0)


五、图像通道的分隔与合并

      在需要的时候,我们可以将一张图像的B、G、R分隔成三个独立的平面。

      需要调用的函数分别为cv2.split()、cv2.merge()。

程序:分离并显示图像的各个通道的值

#coding:utf-8
import cv2
import numpy as np 

image = cv2.imread(".\cat.jpg", 1)
cv2.imshow("img1", image)

#分离通道
b,g,r = cv2.split(image)

#创建与image大小相同的零矩阵
zeros = np.zeros(image.shape[:2], 'uint8')

#显示三个通道的值
cv2.imshow("img_b", cv2.merge([b, zeros, zeros]))
cv2.imshow("img_g", cv2.merge([zeros, g, zeros]))
cv2.imshow("img_r", cv2.merge([zeros, zeros, r]))

image = cv2.merge([b, g, r])
cv2.imshow("img2", image)
cv2.waitKey(0)

运行结果:

至于为什么要和0合并,可以看一下下面这个链接:

https://blog.csdn.net/u014453898/article/details/80715121

发布了47 篇原创文章 · 获赞 23 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/llfjcmx/article/details/86579629