opencv读取&裁剪&写入图片

opencv读取&裁剪&写入图片

    • 1.英文路径
      • 1.1 导包
      • 1.2 找到英文路径
      • 1.3 英文路径读取
      • 1.4 图像白边裁剪
      • 1.5 英文路径写入
      • 1.6 结果展示
    • 2.直接读取中文路径常见错误示范
      • 2.1 读取
      • 2.2 写入
    • 3. 正确读取中文路径
      • 3.1 导包
      • 3.2 找到中文路径
      • 3.3 正确读取中文路径
      • 3.4 图像白边裁剪
      • 3.5 正确写入中文路径
      • 3.6 结果展示

1.英文路径

1.1 导包

import cv2

1.2 找到英文路径

eng_path = r"fruit1/cuitao/cuitao-19453282-321255571.png"

1.3 英文路径读取

cv2.imread读入的方式默认是BGR,而其他函数一般使用RGB,所以有时候需要转换,但是尽量谨慎使用,使用后图片会不同程度地失真

cv2.cvtColor():颜色空间转换函数
第一个参数,图片本身
第二个参数,图片颜色空间转换方式
cv2.COLOR_BGR2RGB或者cv2.COLOR_BGR2RGBA,但是这样操作后的图片和原图片颜色不一样,整体效果不如原图片效果好
cv2.COLOR_BGR2GRAY,图片则会变成黑白照片,黑白照片img.shape只有两个返回值,一个高h,一个宽w

img = cv2.imread("fruit1/cuitao/cuitao-19453282-321255571.png")  # cv2默认BGR
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)  # BGR转换成RGBA,这里不使用效果更好,在这里尽量不要使用
print("eng_img:", img)

1.4 图像白边裁剪

白边的裁剪范围要自己一个一个像素点去尝试,多试几次,才会找到

h, w, c = img.shape  # 图像的高,宽,通道数
print(h, w, c)  # 220 220 3
print(img.shape)  # (220, 220, 3)
a = 28  # 裁剪后的h的起始值
b = h - 27  # 裁剪后的h的结束值
c = 0  # 裁剪后的w的起始值
d = w  # 裁剪后的w的结束值
crops_img = img[a:b, c:d]  # 图像裁剪

1.5 英文路径写入

cv2.imwrite(filename="fruit3/cuitao/cuitao-19453282-321255571.png", img=crops_img)

1.6 结果展示

opencv读取&裁剪&写入图片_第1张图片
opencv读取&裁剪&写入图片_第2张图片
opencv读取&裁剪&写入图片_第3张图片
opencv读取&裁剪&写入图片_第4张图片
opencv读取&裁剪&写入图片_第5张图片

2.直接读取中文路径常见错误示范

2.1 读取

直接读取只会返回一个None

path = r"fruit1/脆桃/脆桃-19453282-321255571.png"
img = cv2.imread(path)

2.2 写入

前边顺利完成裁剪,但是直接写入中文路径,可以正常运行结束但是指定文件夹没有发生任何变化,不会生成裁剪后的图片

cv2.imwrite(filename="fruit3/脆桃/脆桃-19453282-321255571.png", img=crops_img)

3. 正确读取中文路径

3.1 导包

import cv2
import numpy as np

3.2 找到中文路径

path = r"fruit1/脆桃/脆桃-19453282-321255571.png"

3.3 正确读取中文路径

cv2.imdecode的第一个参数是把图像路径用np.fromfile的方式读入,这种读入方式可以容纳中文路径,第二个参数cv2.IMREAD_COLOR可以把四通道图像改成三通道图像
三通道图像:RGB,即红绿蓝,红色为(255,0,0)
四通道图像:RGB+Alpha,Alpha用来衡量一个像素或图像的透明度,Alpha=0,该像素完全透明;Alpha=255,该像素完全不透明

cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数(可以直接写1)
cv2.IMREAD_GRAYSCALE:以灰度模式加载图片(可以直接写0)
cv2.IMREAD_UNCHANGED:包括alpha(可以直接写-1)

img = cv2.imdecode(np.fromfile(path, np.uint8), cv2.IMREAD_COLOR)
print(img)

3.4 图像白边裁剪

白边的裁剪范围要自己一个一个像素点去尝试,多试几次,才会找到

h, w, c = img.shape
print(h, w, c)
print(img.shape)
a = 28
b = h - 27
c = 0
d = w
crops_img = img[a:b, c:d]

3.5 正确写入中文路径

把裁剪后的图像取出来,然后用tofile()转成文件存入指定中文路径中

cv2.imencode()中第一个参数可以写指定转换成的图片类型,可以根据需要去写,第二个参数是裁剪完成后的图片
后边的[1]是从imencode()编码的整体结果中把图片的向量数据取到,然后用tofile()转化到指定的中文路径中,这样可以正确写入中文路径而不会出错,要注意后边tofile()中的路径保存的图片形式要和imencode()中的第一个参数保持一致

# 中文路径写入
print(cv2.imencode(".png", crops_img))
print(cv2.imencode(".png", crops_img)[1])
cv2.imencode(".jpg", crops_img)[1].tofile("fruit3\脆桃\脆桃-19453282-321255571.jpg")

3.6 结果展示

opencv读取&裁剪&写入图片_第6张图片
opencv读取&裁剪&写入图片_第7张图片
opencv读取&裁剪&写入图片_第8张图片
opencv读取&裁剪&写入图片_第9张图片
感谢大家的关注和支持,希望我写的文章能够让你们有收获。
如有不足,还请各位多多指正!

你可能感兴趣的:(CV数据处理,opencv,计算机视觉,python)