Python-Opencv图像处理的小坑

1.背景

最近在做一点图像处理的事情,在做处理时的cv2遇到一些小坑,希望大家遇到的相关的问题可以注意!!

2. cv2.imwrite保存图像

cv2.imwrite(filename, img, [params])

  • filename:需要写入的文件名,包括路径和文件名,以及期望的扩展名(例如,.jpg,.png,.bmp等)。
  • img:需要保存的图像数据。这通常是通过其他OpenCV函数(如cv2.imread()cv2.cvtColor()等)获得的NumPy数组。
  • params:这是一个可选参数,用于指定JPEG或PNG格式的压缩级别等。对于其他格式,此参数将被忽略。默认值为空列表[]

cv2.imwrite('output.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 50])

将JPEG的压缩质量设置为50(最高质量为100),然后将图像保存为新的文件'output.jpg'。这样保存的图像将具有较低的质量和较小的文件大小。

需要注意的是,这种压缩方法是有损的,也就是说,压缩过程中会丢失一些图像信息。因此,压缩后的图像可能无法完全还原为原始图像。在实际应用中,需要根据需求和图像类型来权衡压缩质量和文件大小。

坑1:cv2.imshow显示白茫茫的问题

cv2.imwrite()函数在保存图像时,通常会将图像数据的dtype(数据类型)转换为8位无符号整数类型(即dtype为uint8),而cv2.imshow不会处理图像成uint8,例如模型推理出来是float32类型,如果用cv2.imshow显示灰度图像的话就会出现白茫茫一片!!!

|----------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------|
| cv2.imshow显示 | cv2.imwrite保存的图片 |

思路一:直接float32转uint8!!回答:可以!但效果不好

image = image.astype(np.uint8)

在轮廓边边的时候会出现锯齿!!!(图像中偏白的线条很明显)

|---------------------------------------------------------------------------------------------------|
| |

思路二:先归一化再转uint8呢? 回答:可以!效果很好!!!

image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX)

image = image.astype(np.uint8)

|---------------------------------------------------------------------------------------------------|
| |

现在可以知道cv2.imwrite使用了归一化和类型转换

注意:使用cv2.imshow后面要跟着cv2.waitKey(0)或者下面的代码,不然会出现不显示的问题。

if cv2.waitKey(1) & 0xFF == ord('q'):

break

3. cv2保存视频

复制代码
cap = cv2.VideoCapture('test.mp4')
# 检查视频是否成功打开
if not cap.isOpened():
    print("Error: Couldn't open the video file.")
    return
    # 获取视频的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 设置视频编码器并创建输出视频对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 选择适当的编码器,例如'XVID', 'MJPG', 'MP4V', 等等
out = cv2.VideoWriter('output_file.avi', fourcc, fps,  (352, 288), isColor=False)
while cap.isOpened():
    ret, frame = cap.read()  # 读取下一帧
    # 图片数据前处理
    if not ret:
        break
    img = data_pre_processing(frame)
    compressed_data = sess.run(outputs_name, {input_name: img})
    compressed_image = data_post_processing(compressed_data)
    compressed_image = cv2.normalize(compressed_image, None, 0, 255, cv2.NORM_MINMAX)
    compressed_image = compressed_image.astype(np.uint8)
    out.write(compressed_image)
    # 释放资源并关闭视频文件
cap.release()
out.release()

坑2:保存灰度视频出错

我在数据后处理时使用了下面的代码,将rgb转成了灰度图像,但是cv2保存视频默认是rgb的,导致保存的视频只有几KB的错误视频。

cv2.cvtColor(compressed_image, cv2.COLOR_RGB2GRAY)

解决思路:查文档的api使用

cv2.VideoWriter中的isColor参数

  • isColor=False: 指定输出视频是否为彩色。isColor被设置为False,表示输出视频将是灰度的(即不是彩色的)。如果你希望输出彩色视频,应该将其设置为True。默认是彩色的
相关推荐
黄公子学安全2 小时前
Java的基础概念(一)
java·开发语言·python
程序员一诺2 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
小木_.3 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器
小陈phd3 小时前
OpenCV学习——图像融合
opencv·计算机视觉·cv
Jiude3 小时前
算法题题解记录——双变量问题的 “枚举右,维护左”
python·算法·面试
唐小旭3 小时前
python3.6搭建pytorch环境
人工智能·pytorch·python
是十一月末4 小时前
Opencv之对图片的处理和运算
人工智能·python·opencv·计算机视觉
爱学测试的李木子4 小时前
Python自动化测试的2种思路
开发语言·软件测试·python
kitsch0x975 小时前
工具学习_Conan 安装第三方库
开发语言·python·学习
梦幻精灵_cq5 小时前
《点点之歌》“意外”诞生记
python