资讯专栏INFORMATION COLUMN

opencv图片处理

Apollo / 1625人阅读

一、图片处理

import cv2 # pip install opencv-python    仓库地址:https://github.com/opencv/opencv-pythonimport matplotlib.pyplot as pltdef to_plt_color(img):    # 通过次函数将cv2 与 plt 颜色对应上    img_cp = img.copy()    return img_cp[...,(2,1,0)]def cv_img_show(img, title=""):    # 由于 jupyter notebook 调不了 cv2.imshow() 于是我使用用了 matplotlib.pyplot 包来显示图片, 并且将cv2 的颜色与 matplotlib对应上    if title:        plt.title(title)    plt.imshow(to_plt_color(img))    plt.show()

读取图片与显示图片

# 读取图片文件img = cv2.imread("nikou.jpg") # numpy.ndarrayprint(type(img))print(img.shape)  # 高,宽, BGR (0-255) 注意颜色通道顺序, 与matlabplot 的顺序不一样
(1044, 1200, 3)
#### 显示图片# cv2.imshow("", img)
cv_img_show(img) # 由于 jupyter notebook 调不了 cv2.imshow() 于是我使用用了 matplotlib.pyplot 包来显示图片

编辑与保存图片

cv2.imwrite(path, img) 保存图片

### 编辑图片img_cp = img.copy()def save_channel(img, channel=0):    img = img.copy()    for i in range(img.shape[-1]):        if i != channel:            img[..., i] = 0 # numpy.ndarray 直接按照索引修改像素点为0    cv2.imwrite(f"channel{channel}.jpg", img) # 保存图片        plt.title(f"channel_{channel}") # 显示图片    plt.imshow(to_plt_color(img))    plt.show()    for i in range(img_cp.shape[-1]):    save_channel(img_cp, channel=i)    

截取部分图片

img_part = img.copy()[0:400, 400:800, :] # 截图部分图片cv_img_show(img_part)print(img_part.shape)

(400, 400, 3)

图片通道分离与合并

cv2.split() 通道分离
cv2.merge() 通道合并

## 为了方便识别是哪个通道,所以先做个标记def mark_channel(img):    l = 200    h = int(l / 2)    for i in range(3):        img[i * l: i * l + h, 0:200, i] = 255 # 标记通道img_cp = img.copy()mark_channel(img_cp)blue, green, red = cv2.split(img_cp) # 分离通道,顺序是b,g,rprint(type(blue))print(blue.shape) # 维度下降, 变为单通道
(1044, 1200)
img_cp = img.copy()mark_channel(img_cp)cv_img_show(img_cp)plt.imshow(blue, cmap="gray")plt.show()plt.imshow(green, cmap="gray")plt.show()plt.imshow(red, cmap="gray")plt.show()

img_merge = cv2.merge([blue,green, red])cv_img_show(img_merge)

颜色模式变换

颜色模式变换:cv2.COLOR_BGR2GRAY: BGR模式变成灰度, cv2.COLOR_BGR2RGB: BGR变成 RGB 其他如 CMYK Lab模式也有对应转换

# 彩色变成灰度图img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 也可以变成其他颜色模式, 更改第二个参数即可print(img_gray.shape) # 维度下降,变成二维灰度图
(1044, 1200)
plt.imshow(img_gray, cmap="gray")

# 将 BGR 颜色变成 RGBimg_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# plt.figure()plt.subplot(1,2,1)plt.imshow(img)plt.subplot(1,2,2)plt.imshow(img_rgb)plt.show()

图片相加

"""cv2.copyMakeBorder(img, top, bottom, left, right, border_type, value=None)    参数:        img: numpy.ndarray        top,bottom,left,right: 上下左右边界宽度,单位为像素值        border_type:            cv2.BORDER_CONSTANT, 带颜色的边界,需要传入另外一个颜色值            cv2.BORDER_REFLECT, 边缘元素的镜像反射做为边界            cv2.BORDER_REFLECT_101/cv2.BORDER_DEFAULT            cv2.BORDER_REPLICATE, 边缘元素的复制做为边界            CV2.BORDER_WRAP                value: borderType为cv2.BORDER_CONSTANT时,传入的边界颜色值,如[0,255,0]"""img2 = cv2.imread("mumu.jpg")#img = cv2.cvtColor(img2,cv.COLOR_BGR2RGB)print(img2.shape)# img2 = cv2.resize(img2, img.shape[:2][::-1])# 给图片增加边框img2 = cv2.copyMakeBorder(img2, 500, 0,10,900, borderType=cv2.BORDER_CONSTANT, value=(0,0,0)) # top,bottom,left,right: 上下左右边界宽度,单位为像素值img2 =cv2.resize(img2, img.shape[:2][::-1]) # 图片长宽变换,使 shape一致print(img2.shape)cv_img_show(img2)
(523, 320, 3)(1044, 1200, 3)

img_add = cv2.add(img, img2) # 必须相同 shape才能相加, 当颜色值相加大于255时,赋值为 255cv_img_show(img_add)

img.shape
(1044, 1200, 3)
img3 = cv2.imread("mumu2.jpg")img3 = cv2.resize(img3, img.shape[:2][::-1])cv_img_show(img3)img_merge = cv2.add(img3, img)cv_img_show(img_merge)

cv2.imwrite("merge.jpg",img_merge)
True

将图片保存到内存中(PIL)

某些应用场景需要序列化或者发送图片,如果将处理好的图片,先保存到硬盘,然后再读取二进制内容,这中方式速度慢。可以使用PIL直接写到BytesIO,免去磁盘IO。

import iofrom PIL import Imagewith io.BytesIO() as f:    img_pil = Image.fromarray(cv2.cvtColor(img_merge, cv2.COLOR_BGR2RGB))    img_pil.save(f, "JPEG")#     cv2.imwrite(f, img,cv2.IMWRITE_JPEG_QUALITY)    data = f.getvalue()    print(type(data))    print(data[:10])    with open("pil_save.jpg", "wb") as f:    f.write(data)
b"/xff/xd8/xff/xe0/x00/x10JFIF"

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123316.html

相关文章

  • Android NDK和OpenCV整合开发 (3) OpenCV

    摘要:本文主要是介绍了和开发环境的搭建,以及基于示例程序的演示。使用的方式是将作为库,然后调用。比较时使用的都是基本图像处理操作,例如灰度化,高斯模糊,边缘检测等等。 Android NDK 和 OpenCV 整合开发总结(3) 这一节的主要内容是OpenCV在Android NDK开发中的应用,包括下面几个方面的内容: 如何实现Static Initialization从而不需要安装...

    ZHAO_ 评论0 收藏0
  • OpenCV-Python,计算机视觉开发利器

    摘要:而这其中,很多应用都涉及到计算机视觉这样一个细分领域。常见的图像处理灰度图二值化平滑边缘提取这几种都属于数字图像处理的常用方法。对这方面知识感兴趣的,可以找本数字图像处理的相关教材系统地看一遍,了解数字图像处理的基础。 人工智能 ,一个已经被谈论了几十年的概念(最早是 图灵 在 1950年 提出)。如今这几年,相关技术的发展速度是越来越快。高大上如无人驾驶、智能安防、AI辅助诊断,接地...

    阿罗 评论0 收藏0
  • OpenCV训练自己的物体检测分类器步骤

    摘要:负样本不是我们想要的分类对应的样本,就是除了菠萝的图片样本数据越多检测效果越好,正样本的特征越明显越好,负样本背景越复杂越好。 环境:python3.7  OpenCV3.4.3.18 工具: opencv_annotation.exe opencv_createsamples...

    syoya 评论0 收藏0
  • OpenCV-Python计算机视觉函数

    摘要:如果不设置这个,图片只会一瞬间显示,就消失了。括号里面也可以设置显示时长。 目录 1、概述 2、OpenCV基础 读取图片 imread 调整显示窗口大小 resizeWindow 调整图像尺寸大小 resize 色彩空间进行转换 cvtColor 绘制线段 line 绘制矩形框 recta...

    levius 评论0 收藏0
  • 利用python进行识别相似图片(二)

    摘要:上一篇文章的地址利用进行识别相似图片一安装官网在进行下一步操作时,我们需要安装,本来安装的步骤跟平常安装其他模块一样,而然由于的历史原因用过都懂,弄得一点都不友好。 前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸,只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了。 所以本篇文章着重讲述如何利用openCV定位人脸。 上一篇文章的地址: 利用...

    余学文 评论0 收藏0

发表评论

0条评论

Apollo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<