常用图片处理操作

news2024/11/19 1:31:13

静态图片文件转base64

import base64
with open('1.png', 'rb') as f:
    source = f.read()
base64_img = base64.b64encode(source)

base64转静态图片文件

imgdata = base64.b64decode(base64_img)

# 将图片保存为文件
with open("new.png", 'wb') as f:
    f.write(imgdata)

PS:这里有一点需要注意的是,有的图片的base64,它是有一个编码的头部的,类是data:image/png;base64,******,如果是这样的base64要转为静态图片需要将data:image/png;base64,去掉,否则base64.b64decode会报错,如果你是用上面的方式将图片转为base64的话,是没有上面的编码头的

pillow转base64

import base64
from io import BytesIO

from PIL import Image

image = Image.open('new.png')
byte_data = BytesIO()  # 创建一个字节流管道
image.save(byte_data, format="PNG")  # 将图片数据存入字节流管道
byte_data = byte_data.getvalue()  # 从字节流管道中获取二进制
base64_img = base64.b64encode(byte_data)

base64转pillow

import base64
from io import BytesIO
from PIL import Image

byte_data = base64.b64decode(base64_img)  # base64解码并转bytes
image = Image.open(BytesIO(byte_data))  # 将bytes转为PIL格式图片
image.show()

opencv转base64

import cv2
import base64

# 读取图像
image = cv2.imread('new.png')
# 将图像转换为字节流
buffer = cv2.imencode('.png', image)[1]
img_bytes = buffer.tobytes()
# 将字节流转换为 base64
base64_img = base64.b64encode(img_bytes)

base64转opencv

import cv2
import base64
import numpy as np

# 将 Base64 字符串解码为字节流
buffer = base64.b64decode(base64_img)
# 将字节流转换为 NumPy 数组
image_array = np.frombuffer(buffer, dtype=np.uint8)
# 从 NumPy 数组中读取图像
image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)

cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

pillow转opencv

转化的核心是将pillow的图片转化为numpy.ndarray,opencv的图片格式就是numpy的数组,正因如此,也有图像即数组的说法,图像可以看作是由像素值构成的数组,处理图像实质上就是对这些数组进行操作,通过对数组的操作来实现对图像的处理和分析

PIL.PngImagePlugin.PngImageFile—>numpy.ndarray

import cv2
import numpy as np
from PIL import Image

# 打开 Pillow 图像
pillow_img = Image.open('new.png')
# 将 Pillow 图像转换为 NumPy 数组(numpy.ndarray)
image_np = np.array(pillow_img)
# 将 RGB 格式转换为 BGR 格式
opencv_img = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)

cv2.imshow('image', opencv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

PS:因为pillow与opencv默认读取的图片通道顺序不一样,所以在转换前需要先做RGB->BGR的通道格式转换,反之亦然,所以这里即使不做通道格式转换,也是可以展示的,但显示会偏蓝色

opencv转pillow

numpy.ndarray—>PIL.PngImagePlugin.PngImageFile

import cv2
from PIL import Image

# 读取 OpenCV 图像
opencv_img = cv2.imread('new.png')
# 将 OpenCV 图像从 BGR 格式转换为 RGB 格式
image_rgb = cv2.cvtColor(opencv_img, cv2.COLOR_BGR2RGB)
# 从numpy.ndarray读取图片
pillow_img = Image.fromarray(image_rgb)

pillow_img.show()

图片指定位置叠加

有的时候会需要将两张图片叠加,即将一张图片叠加到另一张图片的指定位置,但经常图片的通道格式会不同,即有的图片有alpha通道,有的没有,还有就是图片叠加位置设置不当,导致前景图像的边界超过背景图像,而程序报错,下面代码可有效解决该问题

import numpy as np
import cv2


def add_alpha_channel(img):
    """ 为jpg图像添加alpha通道 """

    b_channel, g_channel, r_channel = cv2.split(img)  # 剥离jpg图像通道
    alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255  # 创建Alpha通道

    img_new = cv2.merge((b_channel, g_channel, r_channel, alpha_channel))  # 融合通道
    return img_new


def merge_img(background_img, foreground_img, x1, y1):
    """ 将background_img图像与foreground_img图像叠加
        x1,y1分别为图片叠加起始坐标值
    """
    x2 = x1 + foreground_img.shape[1]
    y2 = y1 + foreground_img.shape[0]

    # 判断图像是否已经为4通道
    if background_img.shape[2] == 3:
        background_img = add_alpha_channel(background_img)
    if foreground_img.shape[2] == 3:
        foreground_img = add_alpha_channel(foreground_img)
    '''
    当叠加图像时,可能因为叠加位置设置不当,导致前景图像的边界超过背景图像,而程序报错
    这里设定一系列叠加位置的限制,可以满足前景图像超出背景图像范围时,依然可以正常叠加
    '''
    yy1 = 0
    yy2 = foreground_img.shape[0]
    xx1 = 0
    xx2 = foreground_img.shape[1]

    if x1 < 0:
        xx1 = -x1
        x1 = 0
    if y1 < 0:
        yy1 = - y1
        y1 = 0
    if x2 > background_img.shape[1]:
        xx2 = foreground_img.shape[1] - (x2 - background_img.shape[1])
        x2 = background_img.shape[1]
    if y2 > background_img.shape[0]:
        yy2 = foreground_img.shape[0] - (y2 - background_img.shape[0])
        y2 = background_img.shape[0]

    # 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
    alpha_png = foreground_img[yy1:yy2, xx1:xx2, 3] / 255.0
    alpha_jpg = 1 - alpha_png

    # 开始叠加
    for c in range(0, 3):
        background_img[y1:y2, x1:x2, c] = ((alpha_jpg * background_img[y1:y2, x1:x2, c]) + (alpha_png * foreground_img[yy1:yy2, xx1:xx2, c]))

    return background_img


background_img = cv2.imread('background_img.jpg', cv2.IMREAD_UNCHANGED)
foreground_img = cv2.imread('foreground_img.png', cv2.IMREAD_UNCHANGED)
ret_img = merge_img(background_img=background_img, foreground_img=foreground_img, x1=0, y1=0)
cv2.imshow('new_img', ret_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

上面opencv读取图片cv2.IMREAD_UNCHANGED的参数是加载图像包括它的alpha通道

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1882287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IT运维管理与运营管理的创新与实践

IT运维管理与运营管理的创新与实践 在信息化飞速发展的今天&#xff0c;IT运维管理与运营管理已成为企业保障业务连续性和提升运营效率的关键环节。随着数字化转型的深入&#xff0c;企业对IT运维管理的要求不断提高。本文结合《IT运维管理与运营管理》文档的内容&#xff0c;…

海南云亿商务咨询有限公司引领抖音电商新纪元

在数字化浪潮汹涌的今天&#xff0c;电商行业迎来了前所未有的发展机遇。作为电商服务领域的佼佼者&#xff0c;海南云亿商务咨询有限公司凭借其专业的团队和丰富的经验&#xff0c;专注于抖音电商服务&#xff0c;助力企业快速布局市场&#xff0c;实现销售增长和品牌提升。 …

基于x86+FPGA+AI轴承缺陷视觉检测系统,摇枕弹簧智能检测系统

一、承缺陷视觉检测系统 应用场景 轴类零件自动检测设备&#xff0c;集光、机、软件、硬件&#xff0c;智能图像处理等先进技术于一体&#xff0c;利用轮廓特征匹配&#xff0c;目标与定位&#xff0c;区域选取&#xff0c;边缘提取&#xff0c;模糊运算等算法实现人工智能高…

运算放大器重要参数详解

运算放大器是一种用于放大电压并实现信号处理和放大的电子设备。以下是运算放大器的一些重要参数及其详解: 增益(Gain): 定义:增益是运算放大器输出电压与输入电压之比,表示运算放大器在输入信号上的放大倍数。重要性:增益决定了信号的放大程度,是运算放大器的基本功能…

工程师这几招降低电机EMI的方法,提高系统电磁兼容性能

通过在电机端子之间放置陶瓷电容器、工模滤波器或BDL滤波器均可抑制差模和共模噪声&#xff0c;以提高系统的EMC性能。工程师在本文详细介绍这几种降低电机EMI的方法。 EMC和EMI背景 电磁干扰(EMI)是系统上的电磁噪声的辐射或感应。与大多数电磁电路组件一样&#xff0c;直流…

用易查分下发《致家长一封信》,支持在线手写签名,一键导出PDF!

暑假来临之际&#xff0c;学校通常需要下发致家长信&#xff0c;以正式、书面的形式向家长传达重要的通知或建议。传统的发放方式如家长签字后学生将回执单上交&#xff0c;容易存在丢失、遗忘的问题。 那么如何更高效、便捷、安全地将致家长一封信送达给每位家长呢&#xff1f…

3-数据提取方法1(json)(6节课学会爬虫)

3-数据提取方法1&#xff08;json&#xff09;&#xff08;6节课学会爬虫&#xff09; 1&#xff0c;Json2&#xff0c;哪里会返回json的数据&#xff08;值得尝试的操作&#xff09;3&#xff0c;Json字符串转换成字典或python类型进行数据提取&#xff08;1&#xff09;Json.…

使用热力图表示联邦学习场景中的客户端数据分布

用于生成热力图&#xff0c;记录过程&#xff0c;方便之后直接使用。 使用场景&#xff1a;联邦学习中显示客户端数据分布&#xff0c;或者显示数据分布的各类其他场景 文章目录 一、代码hot.py使用方法 二、参数解释三、样图关键词 一、代码 写这段代码时主要考虑联邦学习中显…

短视频抓取:成都柏煜文化传媒有限公司

短视频抓取&#xff1a;技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;成为现代人生活娱乐的重要组成部分。然而&#xff0c;在海量短视频内容中&#xff0c;如何高效、准确地抓取目标视频&#xff0c;成为了一个…

JUC工具类: Semaphore详解

Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量&#xff0c;它允许n个任务同时访问某个资源&#xff0c;可以将信号量看做是在向外分发使用资源的许可证&#xff0c;只有成功获取许可证&#xff0c;才能使用资源。立刀旁 目录 # 带着BAT大厂…

媒体宣发套餐的概述及推广方法-华媒舍

在今天的数字化时代&#xff0c;对于产品和服务的宣传已经变得不可或缺。媒体宣发套餐作为一种高效的宣传方式&#xff0c;在帮助企业塑造品牌形象、扩大影响力方面扮演着重要角色。本文将揭秘媒体宣发套餐&#xff0c;为您呈现一条通往成功的路。 1. 媒体宣发套餐的概述 媒体…

昇思25天学习打卡营第5天|网络与模型相关要素探讨

目录 从 MindSpore 模块中导入nn和ops 定义模型类 模型层 nn.Flatten nn.Dense nn.ReLU nn.SequentialCell nn.Softmax 模型参数 从 MindSpore 模块中导入nn和ops 将 MindSpore 整个模块引入到当前的 Python 脚本里&#xff0c;方便后续运用 MindSpore 所提供的各类功能…

森林防火气象站:守护森林安全的科技利器

在广袤无垠的森林中&#xff0c;火灾一直是威胁森林生态安全的重要因素。为了有效预防和控制森林火灾&#xff0c;科学家们不断研发新技术&#xff0c;而森林防火气象站正是这一领域的重要成果之一。其中&#xff0c;森林防火气象站凭借其强大的功能和独特的设计&#xff0c;在…

餐厅在线点餐小程序源码系统可外卖配送 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代&#xff0c;餐厅在线点餐小程序已成为餐饮行业的重要工具。它不仅为消费者提供了便捷的点餐体验&#xff0c;也为餐厅提高了运营效率和服务质量。小编给大家分享一款餐厅在线点餐小程序源码系统&#xff0c;该系统不仅支持在线点餐&#xff0c;还具…

Python逻辑控制语句 之 循环语句--while循环

1.while 的介绍 让指定的代码 重复 的执行。 应用场景&#xff1a; while 循环最常用的应用场景就是 让执行的代码 按照 指定的次数 重复执行 2.while 的语法 初始条件设置 # 通常是重复执行的 计数器 while 判断条件&#xff1a; # 判断计数器是否达到目标次数 条件…

博途PLC轴工艺对象随动误差监视功能

S7-1200PLC和V90总线伺服通过工艺对象实现定位控制时在组态工艺对象里有这样的随动误差监视功能介绍,关于这个功能,今天我们解读下,工艺对象组态编程可以参考下面文章链接: S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)_v90工艺对象3号报文-CSDN博客文…

放弃吧!你招不到优秀AI产品经理;程序员优雅做副业指南;一人企业系统方法论(6万字);大模型训练10条黄金法则 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 5亿条国内招聘信息&#xff0c;洞察 1639 种人类职业被AI替代的风险 2023年&#xff0c;OpenAI 发布了一篇论文 GPTs are GPTs: An Early Look at…

Tektronix泰克 AWG70001A 任意波形发生器

Tektronix泰克 AWG70001A 任意波形发生器 AWG70000A 系列任意波形发生器 (AWG) 在采样率、信号保真度和波形内存方面代表着尖端水平&#xff0c;特别适合复杂器件、系统和实验的设计、测试和操作。由于高达 50 GS/s 采样率和 10 位垂直分辨率&#xff0c;它提供了优秀的信号激…

CDS 基本原理与ADT 安装

一、ADT环境安装及介绍 安装eclipse 选择适合的ADT版本&#xff1a; SAP Development Tools for Eclipse - 2023-03 Software Repository https://tools.hana.ondemand.com/2023-06 SAP Development Tools for Eclipse - Latest Software Repository 选择ABAP development …

go Channel原理 (二)

Channel 设计原理 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存。 在主流编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信&#xff0c;同时也提供了一种不同的并发模型&#xff0c;即通…