10个使用NumPy就可以进行的图像处理步骤

news2024/11/17 13:44:17

图像处理是一种数学计算。数字图像由称为像素的彩色小点组成。每个像素由红、绿、蓝(RGB)三个独立的颜色组成。每个像素中的主色由每个RGB分量的数值决定。

本文将介绍10个使用使用NumPy就可以进行的图像处理步骤,虽然有更强大的图像处理库,但是这些简单的方法可以让我们更加熟练的掌握NumPy的操作。

我们首先使用pillow读取图像

 import numpy as np
 
 #Use PIL to access image data
 from PIL import Image
 img = Image.open('monalisa.jpg')
 
 #Create array from image data 
 M = np.array(img)
 
 #Display array from image data 
 display(Image.fromarray(M))

1、缩小图像

 def reduce_image_size_by_n(image, n):
 
     # Get the height and width of the image
     height, width, channels = image.shape
 
     # Reduce the height and width by n
     new_height = height // n
     new_width = width // n
 
     # Create a new array to store the reduced image
     downsampled_image = np.zeros((new_height, new_width, channels), dtype=image.dtype)
 
     # Iterate over each pixel of the reduced image
     for i in range(new_height):
         for j in range(new_width):
 
             # Take every other pixel along each axis to reduce the image
 
             downsampled_image[i, j] = image[n*i, n*j]
 
     return downsampled_image
 
 #Try the function using n = 2
 
 reduced_M = reduce_image_size_by_n(M, 2)
 
 display(reduced_M)

2、水平翻转

 def flip_image(image):
 
   # Takes all rows in image (:) and reverses it the order of columns (::-1)
   flip_image = image[:, ::-1]
   return flip_image
 
 #Try function using reduced image
 display(flip_image(reduced_M))

3、垂直翻转

 def rotate_image (image, n):
   # rotate image using rot90, use n to determine number of rotation 
   rotated_img = Image.fromarray(np.rot90(image, k=n, axes=(1, 0)))
   return rotated_img
 
 #rotate image twice (n=2)
 display(rotate_image(reduced_M, 2))

4、裁剪图像

 def crop_image(image, crop_ratio, zoom_ratio):
 
   #create focused part using crop_ratio and zoom_ratio of choice
   
   top = image.shape[0] // crop_ratio 
   bottom = zoom_ratio * image.shape[0] // crop_ratio
   left = image.shape[1] // crop_ratio
   right = zoom_ratio * image.shape[1] // crop_ratio
 
   # Extract the focused part using array slicing
   focused_part = image[top:bottom, left:right]
   return focused_part
 
 display(crop_image(reduced_M, 4, 2))

5、RGB通道

 def RGB_image(image,image_color):
 
   if image_color == 'R':
     #make a copy of image for the color channel
     img_R = image.copy()
     #set other color channel to zero. Here Red is the first channel [0] 
     img_R[:, :, (1, 2)] = 0
     return img_R
 
   elif image_color == 'G':
     img_G = image.copy()
     #set other color channel to zero. Here Green is the second channel [1]
     img_G[:, :, (0, 2)] = 0
     return img_G
 
   elif image_color == 'B':
     img_B = image.copy()
     #set other color channel to zero. Here Blue is the third channel [2]
     img_B[:, :, (0, 1)] = 0
     return img_B

查看红色通道

 M_red = Image.fromarray(RGB_image(reduced_M, 'R'))
 
 display(M_red)

绿色

 M_green = Image.fromarray(RGB_image(reduced_M, 'G'))
 
 display(M_green)

蓝色

 M_blue = Image.fromarray(RGB_image(reduced_M, 'B'))
 
 display(M_blue)

6、应用滤镜

这里使用棕褐色(Sepia)作为示例,可以根据不同的要求修改转换矩阵

 def apply_sepia(image):
     # Sepia transformation matrix
     sepia_matrix = np.array([[0.393, 0.769, 0.189],
                              [0.349, 0.686, 0.168],
                              [0.272, 0.534, 0.131]])
 
     # Apply the sepia transformation
     sepia_img = image.dot(sepia_matrix.T)  # Using matrix multiplication
 
     # Ensure values are within valid range [0, 255]
     sepia_img = np.clip(sepia_img, 0, 255)
 
     return sepia_img.astype(np.uint8)
 
 # Apply sepia effect
 M_sepia = Image.fromarray(apply_sepia(reduced_M))
 
 display(M_sepia)

7、灰度化

灰度化可以简单的理解为将RBG三个通道合并成一个黑白的通道

 import numpy as np
 
 def grayscale(image):
     # Convert the RGB image to grayscale using weighted average
     grayscale_img = np.dot(image[..., :3], [0.2989, 0.5870, 0.1140])
 
     # Ensure values are within valid range [0, 255]
     grayscale_img = np.clip(grayscale_img, 0, 255)
 
     # Convert to uint8 data type
     grayscale_img = grayscale_img.astype(np.uint8)
 
     return grayscale_img
 
 # Convert the image to grayscale
 M_gray = grayscale(reduced_M)
 
 display(M_gray)

8、像素化

像素是一个一个色块组成的,像素化顾名思义就是将图像分成一定的区域,并将这些区域转换成相应的色块,再有色块构成图形。类似于色彩构图。简单来说,就是把矢量图形转换成像素点组成的点阵图形,也叫栅格化。

 def pixelate_image(image, block_size):
   
     # Determine the number of blocks in each dimension
     num_blocks_y = image.shape[0] // block_size
     num_blocks_x = image.shape[1] // block_size
 
     # Calculate the average color for each block
     block_means = np.zeros((num_blocks_y, num_blocks_x, 3), dtype=np.uint8)
     for y in range(num_blocks_y):
         for x in range(num_blocks_x):
             block = image[y * block_size: (y + 1) * block_size,
                         x * block_size: (x + 1) * block_size]
             block_mean = np.mean(block, axis=(0, 1))
             block_means[y, x] = block_mean.astype(np.uint8)
 
     # Upsample block means to original image size
     pixelated_image = np.repeat(np.repeat(block_means, block_size, axis=0), block_size, axis=1)
 
     return pixelated_image
 
 
 # Set the block size for pixelation (adjust as needed)
 block_size = 10
 
 # Pixelate the image
 M_pixelated = Image.fromarray(pixelate_image(reduced_M, block_size))
 
 display(M_pixelated)

更通俗的的讲就是我的世界风格的图像

9、二值化(Binarize)

二值化是将数值型特征取值阈值化转换为布尔型特征取值,或者通俗的讲就是设定一个阈值,超过阈值设置成ture,否则设置成false

 def binarize_image(image, threshold):
 
   #set pixel value greater than threshold to 255
   binarize_image = ((image > threshold) * 255).astype(np.uint8)
   
   return binarize_image
 
 #set threshold
 threshold = 68
 
 M_binarized = Image.fromarray(binarize_image(reduced_M, threshold))
 
 display(M_binarized)

10、图像融合

最简单的图像同和方法就是根据不同的透明度,对2张图象的像素求和相加,如下所示

 #import and resize second image 
 
 img_2 = np.array(Image.open('Eiffel.jpg').resize(reduced_M.shape[1::-1]))  
 
 def blend_image(image1, image2, , visibility_2 ):
 
   #blend images by multiplying by visibility ratio for each image
 
   blend_image = (image1 * visibility_1 + image2 * visibility_2).astype(np.uint8)
 
   return blend_image
 
 
 
 modified_image = Image.fromarray(blend_image(reduced_M, img_2, 0.7, 0.3))
 
 display(modified_image)

总结

对于图像的操作其实就是对于图像进行数组操作的过程,我们这里展示的一些简单的操作只是为了熟悉Numpy的操作,如果需要更加专业的操作请使用更加专业的库,例如OpenCV或者Pillow。

https://avoid.overfit.cn/post/da27bd78da0b4d76b639c0f9810fb6e0

作者:Ayo Akinkugbe

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

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

相关文章

数据结构-二叉树结尾+排序

一、二叉树结尾 1、如何判断一棵树是完全二叉树。 我们可以使用层序遍历的思路,利用一个队列,去完成层序遍历,但是这里会有些许的不同,我们需要让空也进队列。如果队列里到最后只剩下空那么这棵树就是完全二叉树。具体的实现如下…

【Flask 系统教程 2】路由的使用

Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探…

关于安装Tensorflow的一些操作及问题解决

关于conda和tensorflow: 由于在安装tensorflow遇到各种问题,遇坑则进,耗费了很多时间。由此想整理一些关于安装tensorflow的操作和方法。欢迎各位补充和指正! 1.conda: 1)conda list 查看安装了哪些包。 2&#xff…

OpenCV人脸识别C++代码实现Demo

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法。 官网:https://opencv.org/ Github: https://github.com/opencv/opencv Gitcode…

如何打包Apk适配32和64位

一个表格了解lib下的文件夹 .so文件描述armeabi-v7a第七代及以上的ARM处理器,2011年以后生产的大部分Android设备都使用。arm64-v8a第8代、64位ARM处理器,很少设备,三星GalaxyS6是其中之一。armeabi第5代、第6代的ARM处理器,早期…

C语言数据结构之队列

目录 1.队列的概念及结构2.队列的实现逻辑3.队列的代码实现4.相关例题选择题 •͈ᴗ•͈ 个人主页:御翮 •͈ᴗ•͈ 个人专栏:C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.队列的概念及结构 队列:只允许在一端进行插入数据操作&#x…

Ubuntu系统安装nvfortran详细步骤【笔记】

实践设备:华硕FX-PRO(NVIDIA GeForce GTX 960M) Ubuntu系统安装NVFORTRAN(NVIDIA Fortran Compiler)步骤如下: 安装依赖项:在安装NVFORTRAN之前,你需要确保系统已经安装了一些必要…

IoTDB 入门教程 基础篇①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道,博主在物联网领域深耕多年。 时序数据库,博主已经用过很多,从最早的InfluxDB&a…

c语言刷题——输出图案

1.输出用“*”组成的X形图案 题目:请打印用“*”组成的X形图案 描述: 多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。 输出描述: 针对每行输…

一觉醒来 AI科技圈发生的大小事儿 05月04日

📳CVPR 2024 Highlight | 基于单曝光压缩成像,不依赖生成模型也能从单张图像中重建三维场景 本文介绍了一种基于单曝光压缩成像(SCI)系统和神经辐射场(NeRF)的三维场景拍摄与重建方法,实现了不…

杭电acm2018 母牛的故事 Java解法 经典递归

标准递归题 先模拟 接着找递归出口 再找递归通式 想想看 今天的母牛等于前一天的母牛数加上今天出生的母牛 而三天前的母牛所有母牛都能生一头 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);l…

单例、工厂、策略、装饰器设计模式

1. 单例模式(Singleton Pattern): 单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式的特点是类自己负责保存其唯一的实例,并控制其实例化过程。单例模式广泛应用…

(六)SQL系列练习题(下)#CDA学习打卡

目录 三. 查询信息 16)检索"1"课程分数小于60,按分数降序排列的学生信息​ 17)*按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 18)*查询各科成绩最高分、最低分和平均分 19)*按各科成绩…

【在线oj系统】02-开发环境版本说明

目录 一、前置环境版本介绍 二、SpringCloud组件停更/替换/更新 服务注册和发现 服务调用和负载均衡 分布式事务 服务熔断和降级 服务链路追踪 服务网关 分布式配置管理 三、客户端版本 一、前置环境版本介绍 使用Cloud的版本决定Boot的版本,SpringCloud的…

【C语言】分支和循环(上)

【C语言】分支和循环(上) 1、if语句1.2 else1.3分支中包含多条语句1.4嵌套if1.5悬空else问题 2、关系操作符3、条件操作符4、逻辑操作符:与、或、非(取反)(&&,||,&#xff0…

从零开始学AI绘画,万字Stable Diffusion终极教程(五)

【第5期】ControlNet 欢迎来到SD的终极教程,这是我们的第五节课 这套课程分为六节课,会系统性的介绍sd的全部功能,让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在SD里面,想要…

Mysql复习笔记: 基础概念(待补充)

一. 基础概念 通用概念: 网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句 在数据库中,哪怕执行一条SQL语句,其实也可以是一个独立…

FLIR LEPTON3.5 热像仪wifi 科研实验测温采集仪

点击查看详情!点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情 1、描述 这是一款桌面科研实验测温热成像多功能热像记录仪,小巧轻便…

【C/C++】

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

## 01深度学习介绍与安装PyTorch

文章目录 深度学习的发展历史和基本概念早期历史兴起与发展基本概念 如何安装和设置PyTorch环境系统要求安装步骤验证安装 结语 深度学习的发展历史和基本概念 深度学习&#xff0c;一种通过使用具有多层结构的神经网络来学习数据的复杂模型的机器学习技术&#xff0c;近年来已…