常用图片处理操作

静态图片文件转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通道

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

精密空气加热器负载组

小型便携式 &#xff1a;精密空气加热器&#xff08;负载组&#xff09;能够对数据中心热通道/冷通道冷却系统进行全面测试。EAK 是一款 19 英寸机架式设备&#xff08;10U 高&#xff09;&#xff0c;可轻松安装到各种标准服务器机架中。通过集成可调节的热量水平&#xff08;…

【计算机毕业设计】061互助学习微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Redis学习——Redisson 分布式锁集成及其简单使用

文章目录 引言1. Redisson概述1.1 Redisson的基本概念1.2 Redisson的主要功能1.3 Redisson的优点 2. 开发环境3. Redisson的安装与配置3.1 添加依赖3.2 配置Redisson 4. 使用Redisson4.1 可重入锁4.1.1 可重入锁的概念4.1.2 可重入锁的实现原理4.1.3 简单使用锁的获取和释放 4.…

无线麦克风哪个品牌音质最好,一篇看懂无线领夹麦克风怎么挑选

在数字化时代背景下&#xff0c;直播和个人视频日志&#xff08;Vlog&#xff09;已成为新的文化现象&#xff0c;这些趋势不仅重塑了内容创作&#xff0c;也促进了音频设备市场的繁荣。无线领夹麦克风&#xff0c;以其设计上的轻便和录音上的高效率&#xff0c;成为视频创作者…

手把手带你薅一台云服务器

前两篇&#xff0c;带着大家在自己本地搞了一台 Linux 虚拟机&#xff1a; 【保姆级教程】Windows上安装Linux子系统&#xff0c;搞台虚拟机玩玩【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式&#xff1a;SSH VS Code&#xff0c;开发必备 问题来了&#xff1a;本…

nacos漏洞小结

Alibaba Nacos是阿里巴巴推出来的一个新开源项目&#xff0c;是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集&#xff0c;可以快速实现动态服务发现、服务配置、服务元数据及流量管理…

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 1、定时器0工作在模式0框图 2、定时器0工作在模式0举例 1、Keil C51中有一些关键字&#xff0c;需要牢记&#xff1a; interrupt 0&#xff1a;指定当前函数为外部中断0&#xff1b; interrupt 1&#xff1a;指定当前函数为定时器0中断…

onInterceptTouchEvent() 与 onTouch() 事件分析

前言 本文主要分析 onTouch() 与 onTouchEvent() 事件的差异 正文 先看布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <com.longzhiye.intercepttouch.MyFrameLayout xmlns:android"http://schemas.android.com/apk/res…

PointNet++论文导读

PointNet论文导读 主要改进网络结构&#xff1a;非均匀采样下的特征学习的鲁棒性利用点特征传播处理数据集分割 论文链接:https://arxiv.org/abs/1612.00593 主要改进 PointNet的基本思想是学习每个点的空间编码&#xff0c;然后将所有单个点的特征聚合成一个全局点云标签&am…

模块化编程(二)

模块的导入 经常有这样一句话&#xff1a;“不要重复造轮子”&#xff0c;知道别人已经造好了轮子&#xff0c;并且轮子也好用&#xff0c;那就直接拿别人的轮子来用&#xff0c;此处的“模块导入”就是“拿别人的轮子过来”。前文提到模块化编程的好处之一就是“代码复用性高…

【6.26更新】Win10 22H2 19045.4598镜像:免费下载!

当前微软已经发布了六月最新的KB5039299更新补丁&#xff0c;用户完成升级后&#xff0c;系统版本号将更新至19045.4598。此次更新解决了任务栏上应用跳转列表失败、可能导致系统无法从休眠状态恢复等多个问题&#xff0c;推荐大家升级。如果您不知道去哪里才能下载到该版本&am…

mac|tableau public 仪表盘使用

对华东地区的利润进行仪表盘可视化 选择下面的功能表的新建仪表盘,把上面的表1表2放入其中 通过下图操作将两个表联合起来&#xff0c;即上图使用筛选器时下面的表随之改变 将上图设置为筛选器&#xff0c;可以通过点击地区查看数据

防护用品穿戴自动监测摄像机

随着技术的不断发展&#xff0c;防护用品穿戴自动监测摄像机作为现代安全监控领域的创新应用&#xff0c;正逐渐成为各类工作场所和特定环境中的重要设备。这种摄像机不仅能够实时记录和监控员工的工作状态和安全情况&#xff0c;还能提供数据支持和预警功能&#xff0c;显著提…

第四十篇——系统论:如何让整体效用大于部分之和?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 系统论&#xff0c;又从一个大的生态的角度去考虑&#xff0c;我们应该如…

贪心问题(POJ1700/1017/1065)(C++)

一、贪心问题 贪心算法 贪心算法&#xff08;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪&#xff0c;每一步行动总是按某种指标选取最优的操作。而且他目光短浅&#xff0c;总是只看眼前&#xff0c;并不考虑…

CSS 背景添加白色小圆点样式

css也是开发过程中不可忽视的技巧 此专栏用来纪录不常见优化页面样式的css代码 效果图: 未添加之前: 代码: background: radial-gradient(circle at 1px 1px, #3d3c3c 2px, transparent 0);background-size: 20px 25px;

在AvaotaA1全志T527开发板上烧录AvaotaOS固件

烧写到 TF 卡上 材料准备 首先需要准备的材料有: SD-Card Formatter&#xff1a;balenaEtcherAvaota Pi - A1开发板 x1TF-Card ( 不小于4Gb ) x112V-DC电源适配器 x1TF读卡器 x1USBTTL Splitter x1&#xff08;可选&#xff09;HDMI 采集卡 x1 &#xff08;可选&#xff09;…

体验升级:扫描全能王智能高清滤镜2.0全面测评

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

MSPM0G3507——串口

配置&#xff1a; 主函数: #include "ti_msp_dl_config.h"volatile uint8_t gEchoData 0; int main(void) {SYSCFG_DL_init();NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN); //先清除中断&#xff0c;防止直接进中断NVIC_EnableIRQ(…

手机数据恢复篇:如何在恢复出厂设置后的 iPhone 恢复短信

您可能会认为&#xff0c;在恢复出厂设置iPhone后恢复短信时&#xff0c;一切都会丢失&#xff0c;但是仍然有一些方法可以检索您的重要对话。截至 2024 年&#xff0c;数据恢复技术的进步使得从备份甚至直接从设备内存中抢救消息变得更加容易。无论是通过 iCloud、iTunes 还是…