python 图像数据相互转换

1. opencv 和 bytes
# opencv 转 二进制图片
def mat2bytes(image: np.ndarray) -> bytes:
	return np.array(cv2.imencode('.jpg', image)[1]).tobytes()
# 二进制图片 转 opencv
def bytes2mat(image: bytes) -> np.ndarray:
    return cv2.imdecode(np.array(bytearray(image), dtype='uint8'), cv2.IMREAD_UNCHANGED)
2. opencv 和 base64
# opencv 转 base64
def mat2base64(image: np.ndarry) -> str:
    return str(base64.b64encode(cv2.imencode('.jpg',image)[1]))[2:-1]
# base64 转 opencv
def base642mat(image: str) -> np.ndarry:
	return cv2.imdecode(np.fromstring(base64.b64decode(image), np.uint8), cv2.IMREAD_COLOR)
3. opencv 和 PIL
# opencv 转 PIL
def mat2image(image: np.ndarry) -> Image:
    return Image.fromarray(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))
# PIL 转 opencv
def image2mat(image: Image) -> np.ndarry:
    return cv2.cvtColor(np.asarray(image),cv2.COLOR_RGB2BGR)
4. bytes 和 base64
# 二进制图片 转 base64
def bytes2base64(image: bytes) -> str:
	return base64.b64encode(image).decode() 
# base64 转 二进制图片
def base642bytes(image: str) -> bytes:
    return base64.b64decode(image)
5. opencv 和 QImage
# opencv 转 Qt.QImage
def mat2qimage(image: np.ndarry) -> QImage:
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    y, x = image.shape[:2]
    return QImage(image.data, x, y, x * 3, QImage.Format_RGB888)
# Qt.QImage 转 opencv
# 此处转换完成的图片是4通道(RGBA)还需转换成3通道(RGB)
# image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)
def qimage2mat(image: QImage) -> np.ndarry:
    image = image.convertToFormat(4)
    width = image.width()
    height = image.height()
    ptr = image.bits()
    ptr.setsize(image.byteCount())
    return np.array(ptr).reshape(height, width, 4)
6. opencv 和 matplotlib
# opencv 在 matplotlib 下的显示与保存
import matplotlib.pyplot as plt
import cv2

image = cv2.imread("./a.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # BGR 转 RGB

# 先保存,再显示,否则会无法保存以及正常显示的问题。
plt.imshow(image)
plt.savefig('./b.jpg')  # 保存
plt.show()  # 显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值