1.读取图像,显示图像,保存图像
#图像读取、显示与保存 import numpy as np import cv2 img=cv2.imread('./src/1.jpg') #读取 cv2.imshow("img",img) #显示 cv2.imwrite("./src/2.jpg",img) #保存 cv2.waitKey(0) #让程序进入主循环(让窗口一直渲染)
结果:
2.绘制几何图形
""" 1.绘制直线 cv2.line(img,start,end,color,thickness) - img:要绘制直线的图像 - Start,end: 直线的起点和终点 - color: 线条的颜色 - Thickness: 线条宽度 2.绘制圆形 cv.circle(img,centerpoint, r, color, thickness) - img:要绘制圆形的图像 - Centerpoint, r: 圆心和半径 - color: 线条的颜色 - Thickness: 线条宽度,为-1时生成闭合图案并填充颜色 3.绘制矩形 cv.rectangle(img,leftupper,rightdown,color,thickness) - img:要绘制矩形的图像 - Leftupper, rightdown: 矩形的左上角和右下角坐标 - color: 线条的颜色 - Thickness: 线条宽度 4.向图像中添加文字 cv.putText(img,text,station, font, Fontscale,color,thickness,cv2.LINE_AA) - img: 图像 - text:要写入的文本数据 - station:文本的放置位置 - font:字体样式 - Fontscale :字体大小 - thickness字体线条宽度 - cv2.LINE_AA """ import cv2 import numpy as np img=cv2.imread('./src/a.png') cv2.line(img,(10,50),(200,50),(0,255,0),2) #画线 cv2.circle(img,(100,50),20,(0,0,255),2) #画圆 cv2.rectangle(img, (100,20), (30, 50), (255, 0, 0), 2) #画方 #添加文字 cv2.putText(img,'Hello',(100,200),cv2.FONT_ITALIC,1,(255,255,255),4,cv2.LINE_AA) cv2.imshow("img",img) cv2.waitKey(0)
结果:
获取并修改图像中的像素点
import cv2 img=cv2.imread('./src/b.png') px=img[100,100] print(px) img[100,100]=[0,0,0] cv2.imshow("img",img) cv2.waitKey(0)
结果:
捕获摄像头的实时视频流
cap = cv2.VideoCapture(path)
path视频流资源路径设置为0代表从默认摄像头捕获视频流
ret, frame = cap.read()
从视频流中读取一帧图像,返回两个值:ret
(布尔值,表示是否成功读取帧)和 frame
(当前帧的图像数据)。如果 ret
为 False
,通常表示视频已经结束或读取失败。
import cv2 cap=cv2.VideoCapture(0) while True: ret,frame=cap.read() print(ret,frame.shape) if ret==False or cv2.waitKey(11)==ord("q"): break else: cv2.imshow("camera",frame) cap.release() cv2.destroyWindow("camera")
结果:
3.计算机眼中的图像
1.像素
像素是图像的基本单元,每个像素包含图像的颜色和亮度信息。图像由大量像素组成,计算机以二进制格式存储这些像素。在RGB图像中,每个像素由红色(R)、绿色(G)和蓝色(B)三个颜色通道的值组成。这三种颜色的不同组合可以生成各种颜色。在计算机图像处理中,像素值用于表示和处理这些颜色。例如,在“画图”软件中,用户可以通过调整RGB值来自定义颜色。
2.图像
1.二值图像
一幅二值图像是由仅包含0和1两个值的二维矩阵构成,其中“0”通常表示黑色,“1”表示白色。由于每个像素仅取0或1两种值,计算机中二值图像的数据类型通常为1位二进制。二值图像常用于文字识别(OCR)、线条图的处理以及掩膜图像的存储。
2.灰度图
灰度图像中的每个像素代表一个从黑色到白色的亮度级别。虽然理论上每个像素可以表示任意颜色的不同亮度,但通常灰度图像显示的是黑白之间的各种灰度。与黑白图像不同,灰度图像具有多个灰度级别,而黑白图像只有黑色和白色两种颜色。灰度图像通常使用8位来表示每个像素的亮度,提供256级灰度(使用16位则可达到65536级)。
3.彩色图
RGB图像中的每个像素由红色(R)、绿色(G)和蓝色(B)三个分量表示,每个分量的值范围通常是0到255。与索引图像类似,RGB图像也用于显示彩色图像,但与索引图像不同的是,RGB图像的颜色信息直接存储在图像矩阵中。每个像素的颜色由三个8位的分量(R、G、B)组成,其中每个分量都表示为一个8位无符号整数。RGB图像的尺寸由行数M和列数N决定,每个颜色分量分别用M×N的二维矩阵表示。
#生成一个512*512大小的彩色图片 每一个像素点随机颜色 import cv2 import numpy as np #设置尺寸 h,w=512,512 img=np.zeros((h,w,3),dtype=np.uint8) #创建空白的彩色图像(BGR) img[:]=np.random.randint(0,256,img.shape)#每个像素生成随机BGR值, OpenCV中颜色范围是0-255 cv2.imshow("img",img) cv2.waitKey(0)
4.灰度实验
1.最大值法
import cv2 import numpy as np img=cv2.imread('./src/e.png') print(img) img2=np.zeros((img.shape[0],img.shape[1],1),dtype=np.uint8) for row in range(img.shape[0]): for col in range(img.shape[1]): img2[row,col]=max(img[row,col][0],img[row,col][1],img[row,col][2]) print(img2.shape,img2) cv2.imshow("img2",img2) cv2.imshow("img",img) cv2.waitKey(0)
结果:
2.平均值法
import cv2 import numpy as np img=cv2.imread('./src/e.png') print(img) img2=np.zeros((img.shape[0],img.shape[1],1),dtype=np.uint8) for row in range(img.shape[0]): for col in range(img.shape[1]): img2[row, col] = int((img[row, col][0]/3 + img[row, col][1]/3 + img[row, col][2]/3) ) print(img2.shape,img2) cv2.imshow("img2",img2) cv2.imshow("img",img) cv2.waitKey(0)
结果:
3.加权均值法
import cv2 import numpy as np img=cv2.imread('./src/e.png') print(img) img2=np.zeros((img.shape[0],img.shape[1],1),dtype=np.uint8) wr = 0.299 wg = 0.587 wb = 0.114 for row in range(img.shape[0]): for col in range(img.shape[1]): img2[row, col] = (int(img[row,col][0]*wr) + int(img[row,col][1]*wg) + int(img[row,col][2]*wb)) print(img2.shape,img2) cv2.imshow("img2",img2) cv2.imshow("img",img) cv2.waitKey(0)
结果:
4.两个极端的灰度值
5.二值化实验
import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像 img = cv2.imread('./src/c.png', cv2.IMREAD_GRAYSCALE) # 1. 阈值法(THRESH_BINARY) _, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 2. 反阈值法(THRESH_BINARY_INV) _, binary_inv = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) # 3. 截断阈值法(THRESH_TRUNC) _, trunc = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) # 4. 低阈值零处理(THRESH_TOZERO) _, tozero = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) # 5. 超阈值零处理(THRESH_TOZERO_INV) _, tozero_inv = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV) # 6. OTSU阈值法 _, otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 创建一个 2x3 的网格布局 fig, axs = plt.subplots(2, 3, figsize=(12, 8)) # 绘制每个处理结果 axs[0, 0].imshow(binary, cmap='gray') axs[0, 0].set_title('THRESH_BINARY') axs[0, 0].axis('off') axs[0, 1].imshow(binary_inv, cmap='gray') axs[0, 1].set_title('THRESH_BINARY_INV') axs[0, 1].axis('off') axs[0, 2].imshow(trunc, cmap='gray') axs[0, 2].set_title('THRESH_TRUNC') axs[0, 2].axis('off')
结果:
6.自适应二值化
1.取均值
import cv2 img=cv2.imread('./src/b.png',cv2.IMREAD_GRAYSCALE) print(img) re=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,2) print(re) cv2.imshow("img",img) cv2.imshow("img",re) cv2.waitKey(0)
结果:
2.加权求和
#加权求和法(正态函数) import numpy as np import cv2 arr=np.random.random((30,30))*10 print(arr)
3.高斯分布
#加权法(高斯分布) import cv2 img_data=cv2.imread("./src/b.png",cv2.IMREAD_GRAYSCALE) print(img_data) re=cv2.adaptiveThreshold(img_data,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,2) # print(re) cv2.imshow("img_data",img_data) cv2.imshow("img",re) cv2.waitKey(0)
结果: