Bootstrap

Python - opencv修改图片

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库

安装OpenCV :

pip3 install opencv-python


案例给图片 添加水印

OpenCV 简单操作图片 :

一 ,读取图片

OpenCV能够对图像更进一步处理,例如合并图片、添加水印等 , 安装好opencv后导包cv2 .

import cv2
# 参1图片 , 参2读取方式,如果换成cv2.IMREAD_GRAYSCALE,是以灰色模式读取
img = cv2.imread('image.jpeg', cv2.IMREAD_COLOR)
print(img)  # 矩阵  线性代数

利用 imread函数读取图片
参1 : 图片
参2 : 读取方式 :

  • cv2.IMREAD_COLOR # :1 加载一个彩色图像,图像的任何透明度都将被忽略。这是默认标志
  • cv2.IMREAD_GRAYSCALE # :0 以灰度模式 (grayscale mode) 加载图像
  • cv2.IMREAD_UNCHANGED # :-1 加载图像,包括alpha channel (透明通道)

读取到的是一个矩阵 , 线性代数


二,在窗口上显示图片

import cv2

img = cv2.imread('image.jpeg', cv2.IMREAD_COLOR)

#显示图片参1是窗口名字  参2是图片 的数据
cv2.imshow('窗口A', img)

# 等待按下键盘  传入0代表一直等待 直到有按下  传入>0的数  就等待对应的毫秒数
# 返回按键的ascii码
key = cv2.waitKey(0)

利用imshow函数,把第一部读到的数据读出来
参数1 : 是自定义窗口名
参数2 : 图像数据
(我们可以创建任意多个窗口,但窗口名称需要保证不同)

直接调用imshow是使用默认的窗口格式,可以先创建一个可以缩放的窗口,再用imshow显示在新窗口上

# 创建 一个可以拖拽缩放的创建
cv2.namedWindow('erha',cv2.WINDOW_NORMAL)

cv2.waitKey是一个键盘绑定函数,它的参数是以毫秒为单位。该函数等待在指定毫秒内任何的键盘事件(比如按下键盘中任意一个键)。如果在那个时间段内按下键盘中任何键,程序将继续。如果参数设置为了0,它将无限期地等待键击.


三 ,保存图片

# 保存的文件名字,要保存的图像目表
cv2.imwrite('newimage', img)  

利用imwrite函数,保存图片

参1 : 是一个新的文件名
参2 : 是要保存的图像的矩形信息


读取图片之后,在保存成一个新图片, 那么在保存之前我们就可以对图片做一些修改了.

四 , 修改图片数据

1 给图片添加添加白线

import cv2

# 读取这个图片的矩阵
img = cv2.imread('img1.jpg', cv2.IMREAD_UNCHANGED)


# 2. 循环的方式修改某个位置的BGR
for i in range(500):
    img[i, i] = [255, 255, 255]

# 用矩阵写一个图片(参1图片名,参2矩阵)
cv2.imwrite("newimg.jpg", img)

key = cv2.waitKey(0)
print(key)
# 销毁窗口
cv2.destroyAllWindows()

把修改后的图片包存起来了, 并没有显示在窗口上

2 给图片一个部分贴到另一个图片上

import os
import cv2

# 读取这个图片的矩阵信息
img1 = cv2.imread('img1.jpg', cv2.IMREAD_UNCHANGED)
# 读取这个图片的矩阵
img2 = cv2.imread('img2.jpg', cv2.IMREAD_UNCHANGED)

# x,y  范围不是点
img1[100:250, 100:250] = img2[200:350, 200:350]

# 显示hehe这个窗口,内容是img1
cv2.imshow('hehe', img1)


key = cv2.waitKey(0)
print(key)
# 销毁窗口
cv2.destroyAllWindows()

把图片1的一部分 , 显示在图片2上 .


补充: 访问图像属性

图像的属性都包括

  • 行数

  • 列数

  • 通道数channels

  • 图像数据类型

  • 像素数 …等等…

1 . img.shape
图像的形状可以由img.shape 来得到,它会返回以元组为形式的的行数,列数和通道数(如果图像是彩色的):
一幅完整的图像,是由红色绿色蓝色三个通道组成的。他们共同作用产生了完整的图像,
注意:

读取彩色图的通道数是3
如果图像是灰度的,返回的元组就只会包含行数和列数,没有通道数灰度图没有通道数,所以
用shape 来检测加载的图像是灰度图像还是彩色图像是一种很实用的方法

2 . img.size
像素的总数(行数x列数x通道数)可以用img.size来得到:

3 . img.dtype
图像的数据类型可以通过img.dtype来获得:
img.dtype 在debug 过程中是非常重要的,因为OpenCV-Python 代码中的大量错误都是由无效的数据类型引起的。

uint8 是值 无符号的8位整数 图片rgb每一种颜色的取值是0-255,最多8位
;