Pillow和OpenCV对图片进行高亮及裁剪处理

图片的高亮处理可以通过对图像的像素值进行调整来实现。常见的方法有改变亮度、对比度、应用滤镜等。以下是一些使用Pillow库和OpenCV库来进行图片高亮处理的示例代码。
使用Pillow调整亮度
Pillow库提供了一个非常方便的接口ImageEnhance中的Brightness类来调整图像的亮度。

from PIL import Image, ImageEnhance# 加载图片
image_path = "path_to_your_image.jpg"  # 替换为你的图片路径
image = Image.open(image_path)# 创建亮度增强器
enhancer = ImageEnhance.Brightness(image)# 调整亮度,1表示原始亮度,小于1变暗,大于1变亮
factor = 1.5  # 将亮度增加50%
brighter_image = enhancer.enhance(factor)# 显示结果
brighter_image.show()# 可选:保存调整后的图片
brighter_image.save("brighter_image.jpg")

使用OpenCV调整亮度
用OpenCV进行高亮处理,可以通过改变图片的像素值来实现。以下示例代码展示了如何将所有像素值提高,从而使图像变亮。

import cv2
import numpy as np# 读取图片
image_path = "path_to_your_image.jpg"  # 替换为你的图片路径
image = cv2.imread(image_path)# 增加亮度
# 注意:OpenCV中图片的数据类型为numpy数组,直接相加可能会导致数据溢出
# 使用clip函数确保结果仍然位于有效范围[0, 255]
brighter_image = np.clip(image + 50, 0, 255).astype(np.uint8)# 显示结果
cv2.imshow("Brighter Image", brighter_image)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()# 可选:保存调整后的图片
cv2.imwrite("brighter_image_cv2.jpg", brighter_image)

注意事项
当使用Pillow调整亮度时,enhance方法的参数factor工作在一个相对亮度的级别上,它不是直接加到像素上的值,而是一个相乘的因子。
在使用OpenCV调整亮度时,直接对像素值进行加法操作可能会导致数值溢出,使用np.clip可以确保结果在有效的范围内。
除了简单的亮度调整,Pillow和OpenCV还提供了一系列处理图像对比度、色调、饱和度等方面的工具和函数,可以通过结合使用这些工具来实现更复杂的图像增强效果。

np.clip 函数是NumPy库中的一个重要函数,用于将数组中的元素限制在一个给定的区间内。对于区间之外的元素,如果某个元素小于区间的下限,它会被设置为区间的下限值;如果某个元素大于区间的上限,它会被设置为区间的上限值。对于在这个区间内的元素,保持不变。

基本语法
np.clip(a, a_min, a_max, out=None)
a : array_like —— 输入的数组。
a_min : scalar or array_like —— 剪切区间的下限。小于此值的元素将被设为a_min,可以是标量(单个数值)或数组形式(适用于广播操作)。
a_max : scalar or array_like —— 剪切区间的上限。大于此值的元素将被设为a_max,同样可以是标量或数组形式。
out : ndarray, optional —— 用于存储输出结果的数组。如果提供,其形状必须与输入数组a相匹配。

import numpy as np
# 创建一个数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 使用np.clip函数把所有元素限制在区间[3, 7]内
clipped_arr = np.clip(arr, 3, 7)
print(clipped_arr)
# 结果
[3 3 3 4 5 6 7 7 7]

其他用途
np.clip函数在图像处理中常用来调整像素值的范围。例如,在将图像的亮度提高后,一些像素值可能超出了有效的色彩范围[0, 255]。此时,可以使用np.clip来将这些值限制在有效范围内,避免数据溢出。
在机器学习和深度学习中,np.clip也常用于梯度裁剪(gradient clipping),以防止梯度爆炸问题。
注意事项
在使用np.clip时,提供的下限a_min不应大于上限a_max,否则可能不会得到预期的结果。当处理具有特定范围要求的数据时,合理设置这两个参数至关重要。

在Python中,裁剪图片可以通过多种库来实现,例如最常用的Pillow和OpenCV。下面分别介绍如何使用这两个库来裁剪图片。
使用Pillow裁剪图片
Pillow是一个Python图像处理库,提供了许多图像处理的功能,包括裁剪。以下是使用Pillow裁剪图片的示例:

from PIL import Image# 打开图片
image_path = 'path_to_your_image.jpg'  # 替换成你的图片路径
img = Image.open(image_path)# 定义裁剪区域 (左, 上, 右, 下)
crop_area = (100, 100, 300, 300)  # 根据需要调整这些值
# 裁剪图片
cropped_img = img.crop(crop_area)
# 显示裁剪后的图片
cropped_img.show()
# 保存裁剪后的图片
cropped_img.save('cropped_image.jpg')

使用OpenCV裁剪图片
OpenCV是另一个流行的图像处理库,常用于计算机视觉项目。以下是使用OpenCV裁剪图片的示例:

import cv2# 读取图片
image_path = 'path_to_your_image.jpg'  # 替换成你的图片路径
img = cv2.imread(image_path)# 定义裁剪区域 (y的开始和结束,x的开始和结束)
crop_area = (100, 300, 100, 300)  # 根据需要调整这些值# 裁剪图片
# 注意OpenCV中的图像格式是先行后列(即先高度(y)后宽度(x))
cropped_img = img[crop_area[0]:crop_area[1], crop_area[2]:crop_area[3]]# 显示裁剪后的图片
cv2.imshow('Cropped Image', cropped_img)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()
# 保存裁剪后的图片
cv2.imwrite('cropped_image.jpg', cropped_img)

在这两种方法中,裁剪区域的选择至关重要。Pillow和OpenCV在指定裁剪区域时略有不同:

在Pillow中,裁剪区域是通过(left, upper, right, lower)来指定的,其中坐标原点在图片的左上角。
在OpenCV中,裁剪区域是通过行和列的索引来指定的,使用[y_start:y_end, x_start:x_end]的方式,其中坐标原点同样在图片的左上角,但需要注意的是,OpenCV使用的是(y, x)的顺序而非(x, y)。

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

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

相关文章

Awesome-LLMs-for-Video-Understanding - 基于大型语言模型的视频理解研究

Awesome-LLMs-for-Video-Understanding 是 基于大型语言模型的视频理解研究 github : https://github.com/yunlong10/Awesome-LLMs-for-Video-Understandingpaper:Video Understanding with Large Language Models: A Survey https://arxiv.org/pdf/2312.17432 视频…

C++20中的约束与概念

类模板、函数模板和非模板函数(通常是类模板的成员)可能与约束(constraint)相关联,该约束指定对模板参数的要求(requirements),可用于选择最合适的函数重载和模板特化。约束是使用模板时需要通过模板参数满足的条件或要求。这些要求的命名集合称为概念(c…

Hadoop 分布式集群搭建

HDFS分布式集群搭建 一、部署规划1.1 进程规划1.2 软件规划1.3 用户规划1.4 目录规划 二、 搭建HDFS 分布式集群2.1 HDFS 集群配置2.1.1 下载安装 Hadoop2.1.2 修改 hadoop-env.sh 配置文件2.1.3 修改 core-site.xml 配置文件2.1.4 修改 hdfs-site.xml 配置文件2.1.5 修改 slav…

程序员:全栈的痛你不知道

上周一个同事直接对我开喷,骂我无能,说:“你怎么一个人就搞不定所有系统呢?”,我半支烟纵横IT江湖14余年,还是第一次被人这么嫌弃。 事情缘由 某公司的业务线特别多,有个业务线前后端项目共计…

在网易云音乐服务器故障事件中提升应急处理能力的探讨

一、事件回顾 2024年8月19日下午,网易云音乐疑似出现服务器故障,导致网页端出现502 Bad Gateway报错,且App也无法正常使用。这一突发事件不仅严重影响了用户体验,还给网易云音乐带来了声誉和经济上的损失。面对这一紧急情况&…

ComfyUI IPAdapter plus的模型应该怎么装-免费版-2024.8.25

🎆背景 ipadapter相关的节点大家应该都不陌生,具体是做什么的就不详细介绍了,但是还是有很多新入门的朋友不太了解这个节点相关的这一堆模型到底应该怎么安装。这里就借着官方节点的介绍来大概讲下这个话题。 涉及到的节点源地址&#xff1…

python winreg注册表

一、 winreg.OpenKey是winreg模块中的一个函数,用于打开指定的注册表项并返回一个句柄。函数的语法如下:winreg.OpenKey(key, sub_key, res, sam) 参数说明:key:指定要打开的注册表根键(如winreg.HKEY_CURRENT_USER、…

Spring的单例模式

1.定义 单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。Spring框架默认以单例模式创建Bean,这意味着在Spring容器中,每个Bean定义对应的实例在整个应用程…

【Qt】Qt系统 | Qt事件| 鼠标事件

文章目录 鼠标事件鼠标点击事件鼠标释放事件鼠标双击事件鼠标移动事件 滚轮事件 在 Qt 中,鼠标事件是用 QMouseEvent 实现的。当在窗口中按下鼠标或者移动鼠标时,都会产生鼠标事件 鼠标事件 鼠标点击事件 鼠标按下时通过 虚函数 mousePressEvent() 来…

数学建模学习(118):牛顿冷却定律的原理解析、案例分析与Python求解

介绍来源:2020全国大学生数学建模竞赛论文展示(A070) ,这里我们详细完整的对该优秀论文的方法进行学习和实践。 文章目录 1. 牛顿冷却定律的定义2. 牛顿冷却定律公式3. 牛顿冷却定律的推导4. 牛顿冷却定律的应用方法5. 牛顿冷却定律的验证6. 牛顿冷却定律的图形7. 案例一7.…

线程安全是什么问题?如何引起?死锁是啥?如何解决?

目录 一、什么是线程不安全? 二、如何引起的线程安全?怎么解决? 1)CPU调度执行是随机的,抢占式执行(根本原因,硬件层面咱们无法干预) 2)多个线程,对同一变…

服务端事件(Server-Sent Events):实现实时Web通信的利器

标题:服务端事件(Server-Sent Events):实现实时Web通信的利器 引言 在现代Web应用中,实现实时通信是一个常见需求。服务端事件(Server-Sent Events, SSE)是一种允许服务器主动向客户端发送数据…

【Hot100】LeetCode—105. 从前序与中序遍历序列构造二叉树

目录 1- 思路递归 2- 实现⭐105. 从前序与中序遍历序列构造二叉树——题解思路 3- ACM 实现 原题连接:105. 从前序与中序遍历序列构造二叉树 1- 思路 递归 前序:中左右中序:左中右 让前序的第一个元素作为中序的分割点 分割思路 1- 递归…

做个实验

做个实验 #include <bits/stdc.h> using namespace std; #define int long long #define ll __int128_t #define ar array<int, 2> #define arr array<int, 3> int n, m, k, inf 1LL << 61, mod 998244353;// 1e97; const int N 5e5 50;void sol…

使用gitee存储项目

gitee地址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台 创建gitee远程仓库 将远程仓库内容拉取到本地仓库 复制下面这个地址 通过小乌龟便捷推送拉取代码&#xff1a;https://blog.csdn.net/m0_65520060/article/details/140091437

基于51单片机的百叶窗proteus仿真

地址&#xff1a;https://pan.baidu.com/s/19M6jeTIHJcyDBGNx4H9nTA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

快手怎么免费的去掉视频水印?分享这三个工具给你

​ 我们经常会遇到想要保存的视频带有水印&#xff0c;这不仅影响美观&#xff0c;也不利于分享。为了解决这个问题&#xff0c;我将分享三个免费去除视频水印的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受无干扰的视频体验。 工具一&#xff1a;奈斯水印助手(小程序…

初识MATLAB相关学习笔记

MATLAB的主要功能、应用场景及其相对于其他编程语言的优势和劣势 主要功能 1. 数值计算&#xff1a; 矩阵运算和线性代数。 解微分方程组。 优化算法。 数据插值和拟合。 2. 数据可视化&#xff1a; 2D和3D图形绘制。 图像处理和分析。 动画和GUI构建。 3. 算法开发&#x…

【Linux 从基础到进阶】GlusterFS分布式文件系统搭建

GlusterFS分布式文件系统搭建 引言 随着数据存储需求的快速增长,企业和开发者越来越需要一种高效、可扩展的存储解决方案。GlusterFS是一款开源的分布式文件系统,能够将多个存储服务器组合成一个统一的文件系统,提供高可用性、弹性扩展和性能优化等特性。它可以在标准的以…