01显示图片
import cv2 as cv
src = cv.imread("2.jpg") #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建窗口
cv.imshow("input image",src)
cv.waitKey(0)
cv.destroyAllWindows()
02图像加载与保存
图像属性:通道数目 高与宽 像素数据 图像类型
import cv2 as cv
def get_image_info(image):
print(type(image))
print(image.shape)
print(image.size)
print(image.dtype)
print("=====Hello Python=====")
src = cv.imread("dog.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
get_image_info(src)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果
=====Hello Python=====
<class 'numpy.ndarray'> #读出来的数据类型
(1000, 667, 3)
2001000
uint8 #每个像素点有三个信道,每个信道所占位数是无符号int8位
读取视频
import cv2 as cv
def Video_demo():
capture = cv.VideoCapture(0) #打开摄像头
while(True):
ret , frame = capture.read() #frame就是视频中的每一帧
frame = cv.flip(frame,1) #左右变换
cv.imshow("video",frame)
c = cv.waitKey(50) #程序等待50毫秒读取下一帧 改成1会更流畅
if c == 27: #EXC的ASCII码为27,回车:13,换行(ctrl+Enter):10,,空格:32
break
print("=====Hello Python=====")
Video_demo()
cv.waitKey(0)
cv.destroyAllWindows()
保存图片
import cv2 as cv
print("=====Hello Python=====")
src = cv.imread("dog.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY) #灰度处理
cv.imwrite("D://result.png",gray) #保存灰度图
cv.waitKey(0)
cv.destroyAllWindows()
03Numpy数组操作
读取属性
import cv2 as cv
import numpy as np
def access_pixels(image):
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("width:%s,height:%s,channels:%s"%(width,height,channels))
print("=====Hello Python=====")
src = cv.imread("dog.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
access_pixels(src)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果
=====Hello Python=====
(1000, 667, 3)
width:667,height:1000,channels:3
遍历和修改每个像素点
import cv2 as cv
import numpy as np
def access_pixels(image):
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("width:%s,height:%s,channels:%s"%(width,height,channels))
for row in range(height):
for col in range (width):
for c in range(channels):
pv = image[row,col,c] #获取它的维度
image[row,col,c] = 255 - pv #修改它的维度
cv.imshow("pixels_demo",image)
print("=====Hello Python=====")
src = cv.imread("dog.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
access_pixels(src)
cv.waitKey(0)
cv.destroyAllWindows()
效果:创建新图像
多通道的:通道顺序(blue,green,red),所以下面的程序得到一张蓝色图片。
np.zeros:创建数组并赋值为0
np.ones:创建数组并赋值为1
import cv2 as cv
import numpy as np
"""""
def access_pixels(image):
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("width:%s,height:%s,channels:%s"%(width,height,channels))
for row in range(height):
for col in range (width):
for c in range(channels):
pv = image[row,col,c] #获取它的维度
image[row,col,c] = 255 - pv #修改它的维度
cv.imshow("pixels_demo",image)
"""""
def create_image():
img = np.zeros([400,400,3],np.uint8)
img[ : , : ,0] = np.ones([400,400])*255 #修改它的第一个通道,img[ : , : ,1]是绿色,img[ : , : ,2]是红色
cv.imshow("new image",img)
print("=====Hello Python=====")
create_image()
cv.waitKey(0)
cv.destroyAllWindows()
单通道的:常见的是灰度图。如下显示的是一张400*400的灰色图片。
import cv2 as cv
import numpy as np
def create_image():
img = np.ones([400,400,1],np.uint8)
img = img * 127
cv.imshow("new image",img)
print("=====Hello Python=====")
create_image()
cv.waitKey(0)
cv.destroyAllWindows()
04色彩变换
上面03中的颜色取反的代码可以简化成使用opencv中的API来完成。
import cv2 as cv
def inverse(image):
dsc = cv.bitwise_not(image)
cv.imshow("inverse image",dsc)
print("=====Hello Python=====")
src = cv.imread("dog.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
inverse(src)
cv.waitKey(0)
cv.destroyAllWindows()
常见的色彩空间:RGB、HSV、HIS、YCrCb
import cv2 as cv
def color_space_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray)
hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
cv.imshow("hsv",hsv)
yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV)
cv.imshow("yuv",yuv)
Ycrcb = cv.cvtColor(image,cv.COLOR_BGR2YCrCb)
cv.imshow("ycrcb",Ycrcb)
print("=====Hello Python=====")
src = cv.imread("dog.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
color_space_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
05色彩空间
过滤颜色:用InRange函数来过滤视频中的颜色。
提取视频中的绿色:
import cv2 as cv
import numpy as np
def extract_object_demo():
capture = cv.VideoCapture("C:/Users/Administrator/Desktop/green.mp4")
while(True):
ret,frame = capture.read()
if ret == False:
break
hsv = cv.cvtColor(frame , cv.COLOR_BGR2HSV)
lower_hsv = np.array([35,43,46]) #通过读表可知
upper_hsv = np.array([77,255,255]) #通过读表可知
mask = cv.inRange(hsv,lowerb = lower_hsv,upperb = upper_hsv)
cv.imshow("video", frame)
cv.imshow("mask",mask)
c = cv.waitKey(1)
if c==27:
break
print("=====Hello Python=====")
extract_object_demo()
cv.waitKey(0)
cv.destroyAllWindows()
通道分离与合并
print("=====Hello Python=====")
src = cv.imread("dog.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
b,g,r = cv.split(src) #通道的分离
cv.imshow("blue:",b)
cv.imshow("green:",g)
cv.imshow("red:",r)
src[ : ,: ,2] = 0 #三个通道的,最后一个通道改为0
cv.imshow("changed image",src)
src = cv.merge([b,g,r])
cv.imshow("merge image",src) #通道的合并
cv.waitKey(0)
cv.destroyAllWindows()