Python OpenCV 图像与视频处理实战指南
本文深入解析 Python OpenCV 的核心操作,涵盖图片与灰度图的读取、视频流处理、图像裁剪、RGB 通道分离、边界填充、图像融合与缩放变换,以及二值化阈值处理。通过具体代码示例展示各功能的实现细节与参数配置,适用于图像预处理及计算机视觉入门学习。
图像读取与显示基础
使用 OpenCV 读取并显示原始图片。通过 cv.imread 加载指定路径的文件,获取图像形状信息后,利用 cv.imshow 展示图像窗口,并通过 cv.waitKey(0) 等待用户按键,最后使用 cv.destroyAllWindows 关闭所有窗口。
def display_img(file="p.jpeg"):
img = cv.imread(file)
print (img.shape)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
灰度图像加载与保存
读取并处理灰度图片。在 cv.imread 中指定 cv.IMREAD_GRAYSCALE 参数以直接加载为灰度图像。获取形状后显示图像,并使用 cv.imwrite 将处理后的灰度图像保存为指定文件名(如 gray_img.png)。
def display_gray_img(file="p.jpeg"):
img = cv.imread(file,cv.IMREAD_GRAYSCALE)
print (img.shape)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
cv.imwrite("gray_img.png",img)
视频流读取与逐帧处理
读取并处理视频文件。使用 cv.VideoCapture 打开视频文件,检查是否成功打开。在循环中逐帧读取视频,若读取失败则跳出循环。对每一帧进行灰度转换后显示,并通过 cv.waitKey 设置延时,当检测到 ESC 键(ASCII 27)时退出循环。最后释放视频捕获对象并销毁窗口。
def display_video(file="sj.mp4"):
v = cv.VideoCapture(file)
if v.isOpened():
open,frame = v.read()
else:
open=False
while open:
ret,frame = v.read()
if frame is None:
break
if ret == True:
gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
cv.imshow("result",gray)
if cv.waitKey(10) & 0xFF == 27:
break
v.release()
v.waitKey(0)
v.destroyAllWindows()
图像区域裁剪技巧
截取图像特定区域。加载图像后,通过数组切片操作提取图像的左上角 200x200 像素区域。将该裁剪后的图像显示在新窗口中,等待按键后关闭所有窗口。
def get_frame_img(file="p.jpeg"):
img = cv.imread(file)
print (img.shape)
cat = img[0:200,0:200]
cv.imshow('get_frame_img',cat)
cv.waitKey(0)
cv.destroyAllWindows()
RGB 通道分离与重组
提取并分离 RGB 通道。加载图像后,使用 cv.split 将图像分解为蓝、绿、红三个单通道图像。打印各通道形状后,使用 cv.merge 重新合并为原图像以验证形状。接着,分别创建三个副本,通过置零其他通道的方式单独显示红色、绿色和蓝色通道的视觉效果。
def extrats_rgb_img(file="p.jpeg"):
img = cv.imread(file)
b,g,r = cv.split(img)
print (b.shape,g.shape,r.shape)
new_img = cv.merge((b,g,r))
print (new_img.shape)
copy_img_r = img.copy()
copy_img_r[:,:,0]=0
copy_img_r[:,:,1]=0
cv.imshow("r_img",copy_img_r)
copy_img_g = img.copy()
copy_img_g[:,:,0]=0
copy_img_g[:,:,2]=0
cv.imshow("g_img",copy_img_g)
copy_img_b = img.copy()
copy_img_b[:,:,1]=0
copy_img_b[:,:,2]=0
cv.imshow("b_img",copy_img_b)
图像边界填充算法
应用多种边界填充算法。定义五种边界类型:复制法(BORDER_REPLICATE)、反射法(BORDER_REFLECT)、以边缘像素为轴的反射法(BORDER_REFLECT_101)、外包装法(BORDER_WRAP)和常量填充法(BORDER_CONSTANT)。设置上下左右各 50 像素的填充大小,对原始图像应用上述五种填充方式,并使用 matplotlib 绘制子图展示原始图像及五种填充后的结果。
def border_fill_img(file="p.jpeg"):
border_type = [
cv.BORDER_REPLICATE,#复制法,复制边缘
cv.BORDER_REFLECT, #反射法,对感兴趣的图像中的像素在两边进行复制
cv.BORDER_REFLECT_101,#反射法,以边缘像素为轴,对称
cv.BORDER_WRAP,#外包装法
cv.BORDER_CONSTANT#常量法,常量填充
]
border_title = [
"REPLICATE",
"REFLECT",
"REFLECT_101",
"WRAP",
"CONSTANT"
]
img = cv.imread(file)
top_size,bottom_size,left_size,right_size = (50,50,50,50)
plt.subplot(231)
plt.imshow(img,"gray")#原始图像
plt.title("ORIGNAL")
for i in range(len(border_type)):
result = cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,border_type[i])
plt.subplot(232+i)
plt.imshow(result,"gray")
plt.title(border_title[i])
plt.show()

图像融合与几何变换
执行图像融合与几何变换。读取两张图像后,调整两者大小至 500x500。使用 cv.addWeighted 以 0.4 和 0.6 的权重进行图像叠加融合。随后,分别对两张图像进行非均匀缩放:一张沿 x 轴放大 3 倍(fx=3, fy=1),另一张沿 y 轴放大 3 倍(fx=1, fy=3),并展示变换后的结果。
def img_compose(file1="tu.jpeg",file2="gui.jpeg"):
img_1 = cv.imread(file1)
img_2 = cv.imread(file2)
print (img_1.shape)
print (img_2.shape)
img_1= cv.resize(img_1,(500,500))
img_2= cv.resize(img_2,(500,500))
print (img_1.shape)
print (img_2.shape)
res = cv.addWeighted(img_1,0.4,img_2,0.6,0)
plt.imshow(res)
plt.show()
res = cv.resize(img_1,(0,0),fx=3,fy=1)
plt.imshow(res)
plt.show()
res = cv.resize(img_2,(0,0),fx=1,fy=3)
plt.imshow(res)
plt.show()

图像二值化处理
进行图像二值化处理。读取灰度图像后,设定阈值 limit 为 120。使用 cv2.threshold 函数,指定 cv2.THRESH_BINARY_INV 标志进行反向二值化处理,生成阈值图像。最后显示处理后的二值化图像并返回结果。
def Binarization(filepath):
img = cv2.imread(filepath,0)
limit = 120
ret,thresh=cv2.threshold(img,limit,255,cv2.THRESH_BINARY_INV)
plt.imshow(thresh,'gray')
plt.show()
return thresh
Binarization('t1.jpg')
本文介绍了 Python OpenCV 在图像与视频处理中的多项基础操作,包括读取、裁剪、通道分离、边界填充、融合变换及二值化。更多相关 Python OpenCV 内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









