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

图像处理是一种数学计算。数字图像由称为像素的彩色小点组成。每个像素由红、绿、蓝(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

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

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

相关文章

dp 动态规划 力扣

64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,3,1],[1,5,1],[4,2,1]] 输…

IDA使用教程-IDA7.5版本

IDA使用教程 右键使用32bit分析程序 一,IDA修改,保存 修改:IDA->edit->Patch program(补丁程序)->Assemble(汇编)修改。 保存: IDA->edit->Patch program->Appl…

【数据结构】--- 深入剖析二叉树(上篇)--- 初识树和二叉树

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 数据结构之旅 🏠 初识树 📒 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点…

Leetcode354. 俄罗斯套娃信封问题

Every day a Leetcode 题目来源:354. 俄罗斯套娃信封问题 解法1:动态规划 我们必须要保证对于每一种 w 值,我们最多只能选择 1 个信封。 首先我们将所有的信封按照 w 值第一关键字升序、h 值第二关键字降序进行排序; 随后我们…

QT+串口调试助手+扩展版

前言:此文章是这篇文章的拓展 QT串口调试助手基本版-CSDN博客,如果需要独立完成串口调试助手直接看基本版文章即可,如果需要完成串口调试助手的其他功能,参考拓展版。 一、更新QT串口调试助手UI界面 1、ui串口设置界面 2、ui串口…

Java与Go: 生产者消费者模型

什么是生产者消费者模型 生产者-消费者模型(也称为生产者-消费者问题)是一种常见的并发编程模型,用于处理多线程或多进程之间的协同工作。该模型涉及两个主要角色:生产者和消费者,一个次要角色:缓冲区。 生…

Unity---版本控制软件

13.3 版本控制——Git-1_哔哩哔哩_bilibili Git用的比较多 Git 常用Linux命令 pwd:显示当前所在路径 ls:显示当前路径下的所有文件 tab键自动补全 cd:切换路径 mkdir:在当前路径下创建一个文件夹 clear:清屏 vim…

EtherCAT通信总线状态监视

1、EtherCAT总线运动控制学习笔记 EtherCAT总线运动控制学习笔记(RXXW_Dor)_汇川pdo控制命令607a-CSDN博客文章浏览阅读3.3k次,点赞3次,收藏9次。说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架,详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架,专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口,可以用于构建神经网络模型,并…

数据结构---单链表

题目&#xff1a;构造一个单链表。 使用的软件&#xff1a;VS2022使用的语言&#xff1a;C语言使用的项目&#xff1a;test.c Setlist.h Setlish.c 项目实践&#xff1a; Setlist.h的代码为&#xff1a; #pragma once#include<stdio.h> #include<stdlib.h> #incl…

SQL注入基础-3

一、宽字节注入 1、宽字节&#xff1a;字符大小为两个及以上的字节&#xff0c;如GBK&#xff0c;GB2312编码 2、数据库使用GBK编码时&#xff0c;会将两个字符合并为一个汉字(宽字节)。特殊值字符如单引号都会被转义【--->\】&#xff0c;如sqli-lads第32关&#xff0c;输…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…

Sarcasm detection论文解析 |使用基于多头注意力的双向 LSTM 进行讽刺检测

论文地址 论文地址&#xff1a;https://ieeexplore.ieee.org/document/8949523 论文首页 笔记框架 使用基于多头注意力的双向 LSTM 进行讽刺检测 &#x1f4c5;出版年份:2020 &#x1f4d6;出版期刊:IEEE Access &#x1f4c8;影响因子:3.9 &#x1f9d1;文章作者:Kumar Avinas…

第11章 软件工程

这里写目录标题 1.软件过程1.1能力成熟度模型(CMM)1.2能力成熟度模型集成(CMMI)1.3瀑布模型(线性顺序)1.4增量模型1.5演化模型1.5.1原型模型1.5.2螺旋模型 1.6喷泉模型1.7统一过程(UP)模型 2.敏捷方法3.系统设计4.系统测试4.1单元测试(模块测试)4.2集成测试4.3黑盒测试(功能测试…

论文辅助笔记:Tempo之modules/prompt.py

1 get_prompt_param_cls 2 get_prompt_value 3 Prompt 类 3.1 _init_weights 3.2 forward

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

gige工业相机突破(一,准备资源)

gige相机能不能绕开相机生产商提供的sdk&#xff0c;而直接取到像&#xff1f; 两种办法&#xff0c;第一&#xff0c;gige vision2.0说明书&#xff0c;第二&#xff0c;genicam 首先你会去干什么事&#xff1f; 好几年&#xff0c;我都没有突破&#xff0c;老虎吃天&#x…

产品AB测试设计

因为vue2项目升级到vue3经历分享1&#xff0c;vue2项目升级到vue3经历分享2&#xff0c;前端系统升级&#xff0c;界面操作也发生改变&#xff0c;为了将影响降到最低&#xff0c;是不能轻易让所有用户使用新系统的。原系统使用好好的&#xff0c;如果新界面用户不喜欢&#xf…

2024/5/5 英语每日一段

Meanwhile, in a twist, Tesla this month settled a high-profile case in Northern California that claimed Autopilot played a role in the fatal crash of an Apple engineer, Walter Huang. The company’s decision to settle with Huang’s family—along with a ruli…

如何打包Apk适配32和64位

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