在许多计算机视觉任务中,图像处理占据了很重要的角色,尤其是在目标检测、特征提取、分类、跟踪等计算机视觉任务中。图像处理是一个复杂的过程,涉及到图像的采集、分析、存储、显示等环节。本文将讨论基于Python实现的图像处理的相关知识和技术。下面先介绍图像的定义、结构、属性及一些基本术语。
图像的定义 在数学上,图像(image)是指空间中的点所组成的集合。图像由像素或灰度值表示。一幅图像通常可以看作是一个二维或三维矩阵。
图像的结构 图像由两个维度,即行数和列数。例如,彩色图像的像素点有三个颜色通道(红、绿、蓝)。在彩色图像中,每个像素点都有一个坐标值,描述这个像素点相对于整个图像的位置。
图像的属性
下面我们通过实例,使用 Python 来实现一些常见的图像处理技术,包括图片缩放、拼接、锐化、均衡化、图片增强、形态学处理等。具体如下:
from PIL import Image
import numpy as np
img = Image.open('lena_color.tif') # 以 RGB 模式打开彩色图像
width = int(img.size[0] * 0.5) # 宽度缩小一半
height = int(img.size[1] * 0.5) # 高度缩小一半
img_small = img.resize((width, height), Image.ANTIALIAS) # 使用 ANTIALIAS 选项进行放缩
img_arr = np.array(img).astype("uint8") # 将图像转换为 Numpy array
img_small_arr = np.array(img_small).astype("uint8")
print(f"Original size is {img.size}, new size is {img_small.size}")
print(f"Difference between original pixel values and resized small ones:\n{np.abs(img_arr - img_small_arr)}")
from PIL import Image
import os
path = 'images' # 指定图片路径
files = sorted([os.path.join(path, f) for f in os.listdir(path)]) # 获取指定路径的所有图片文件
img_new = None # 初始化空图像
for i, img in enumerate(imgs):
print(f"{i+1}. Size of the current picture is {img.size}")
if img_new == None:
img_new = img # 如果是第一张图片,直接赋值给 img_new
else:
img_new = Image.alpha_composite(img_new, img) # 用 alpha 透明度模式拼接图片
if not os.path.exists('output'): # 检查输出目录是否存在,不存在则创建
os.mkdir('output')
from PIL import ImageFilter, ImageEnhance
img = Image.open('lena_gray.tif').convert('L') # 打开灰度图像并转换为灰度图像
filter_blur = img.filter(ImageFilter.GaussianBlur(radius=3)) # 高斯滤波降低噪声
enhancer = ImageEnhance.Sharpness(filter_blur) # 创建 Sharpness 对象
sharped_img = enhancer.enhance(2.0) # 锐化增强
if not os.path.exists('output'): # 检查输出目录是否存在,不存在则创建
os.mkdir('output')
sharped_img.save(os.path.join('output','sharped.tif')) # 保存锐化后的图像
from skimage import data, exposure
import numpy as np
import matplotlib.pyplot as plt
img = data.moon() # 读取月牙图像
increasing_hist = exposure.equalize_adapthist(img, clip_limit=0.03) # 使用 CLAHE 直方图均衡化
fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(8, 3)) # 设置子图大小
ax[0].imshow(img, cmap='gray') # 原始图像
ax[0].set_title('Original image')
ax[1].imshow(increasing_hist, cmap='gray') # 均衡化图像
ax[1].set_title('Histogram equalized image')
ax[2].hist(increasing_hist.flatten(), bins=256, range=[0, 256], histtype='stepfilled', color='black')
ax[2].set_xlim([0, 256]) # 设置 x 轴刻度范围
ax[2].set_ylim([0, np.max(increasing_hist)*1.1]) # 设置 y 轴刻度范围
ax[2].set_xlabel('Pixel intensity')
ax[2].set_ylabel('Number of pixels')
ax[2].set_title('Histogram of the histogram equalized image')
plt.tight_layout() # 自动调整子图间距
plt.show() # 显示图像
from PIL import ImageEnhance
from skimage import data
img = data.coins() # 读取硬币图像
enhancers = [ImageEnhance.Brightness(img),
ImageEnhance.Color(img),
ImageEnhance.Contrast(img)]
fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(6, 8)) # 设置子图布局
titles = ["Brightness", "Color", "Contrast"] # 设置子图标题
images = [(enhancers[j*2]).enhance(1.5 + j) for j in range(3)] # 设置增强因子列表
for i, im in enumerate(images): # 遍历增强后图片
row, col = divmod(i, 2) # 根据索引计算子图的行列坐标
axes[row][col].imshow(im) # 在子图中绘制图像
axes[row][col].set_axis_off() # 关闭坐标轴
axes[row][col].set_title(titles[row]) # 添加子图标题
plt.tight_layout() # 自动调整子图间距
plt.show() # 显示图像
from scipy import ndimage
import matplotlib.pyplot as plt
img = np.zeros((100, 100)).astype("uint8") # 创建 100x100 黑色图像
img[:50,:] = 255 # 第 1/4 置为白色
img[:, :50] = 255 # 第 1/4 置为白色
img[50:, :] = 255 # 第 1/4 置为白色
img[:, 50:] = 255 # 第 1/4 置为白色
eroded_img = ndimage.binary_erosion(img).astype("uint8") # 腐蚀处理
dilation_img = ndimage.binary_dilation(img).astype("uint8") # 膨胀处理
gradient_img = eroded_img - dilation_img # 形态学梯度
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8)) # 设置子图布局
axes[0][0].imshow(img, cmap="gray") # 原始图像
axes[0][0].set_title('Original binary image')
axes[0][1].imshow(eroded_img, cmap="gray") # 腐蚀图像
axes[0][1].set_title('Eroded image')
axes[1][0].imshow(dilation_img, cmap="gray") # 膨胀图像
axes[1][0].set_title('Dilated image')
axes[1][1].imshow(gradient_img, cmap="gray") # 形态学梯度图像
axes[1][1].set_title('Morphological gradient')
plt.tight_layout() # 自动调整子图间距
plt.show() # 显示图像
小编是一名Python开发工程师,自己整理了一套 【最新的Python系统学习教程】,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。
保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
如果你是准备学习Python或者正在学习,下面这些你应该能用得上:
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
用通俗易懂的漫画,来教你学习Python,让你更容易记住,并且不会枯燥乏味。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
👉CSDN大礼包:《Python入门资料&实战源码&安装工具】免费领取(安全链接,放心点击)