1、有些模型只识别.jpg或.png格式的图像,如何将其他格式转换成.jpg或.png格式,且尽可能降低图像质量损失?解决方案如下:
import cv2
image = cv2.imread('source.tif')
num_jpg = 100
# num_jpg表示图像质量,取值0~100,值越大,图像越清晰,占用内存也越大
cv2.imwrite('target.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), num_jpg])
num_png = 9
# num_png表示压缩级别,取值0~9,值越大,图像压缩程度越大,占用内存越小,清晰度变化不明显
cv2.imwrite('target.png', image, [int(cv2.IMWRITE_PNG_COMPRESSION), num_png])
2、原始图像是16位的,如何确保读取、显示、保存时还是16位的?对比发现,cv2比Image和plt功能强:
Image 读取OK 显示NG 保存OK
cv2 读取OK 显示OK 保存OK
plt 读取OK 显示OK 保存NG
import numpy as np
from PIL import Image
# 读取图像
image = Image.open('source.tif')
# 无法显示图像,显示一片空白
image.show()
# 可以是.png/.tif/.tiff后缀,但不可以是.jpg后缀,否则16位被压缩为8位
image.save('source.png')
# 打印图像
image = np.array(image)
print(image)
import cv2
# 读取图像
image = cv2.imread('source.tif', cv2.IMREAD_UNCHANGED)
# 正常显示图像,灰度值为16位,如果显示器是8位的,color值也是8位的
# x,y = pyautogui.position()
# color = pyautogui.screenshot().getpixel((x,y))
cv2.imshow('source',image)
cv2.waitKey()
# 可以是.png/.tif/.tiff后缀,但不可以是.jpg后缀,否则16位被压缩为8位
cv2.imwrite('source.png', image)
# 打印图像
print(image)
import matplotlib.pyplot as plt
# 读取图像
image = plt.imread('source.tif')
# 正常显示图像,灰度值为16位,如果显示器是8位的,color值也是8位的
# x,y = pyautogui.position()
# color = pyautogui.screenshot().getpixel((x,y))
plt.imshow(image,'gray')
plt.show()
# 无论是.png/.tif/.tiff后缀,还是.jpg后缀,都直接保存为32位
plt.imsave('source.png', image)
# 打印图像
print(image)