Python 图像处理技巧

简介: 本文介绍了Python图像处理中需要掌握的15个基本技能,涵盖图像读取与保存、颜色空间转换、裁剪与调整大小、滤波与平滑、边缘检测、阈值处理、形态学操作、直方图处理、特征检测与描述、图像配准与特征匹配、轮廓检测与分析、图像分割、模板匹配、透视变换与仿射变换以及傅里叶变换等内容。通过OpenCV、Pillow和Matplotlib等库实现相关功能,为图像处理提供了全面的基础指导。

下面为你介绍Python图像处理时需要掌握的15个基本技能:

1. 图像读取与保存

借助OpenCV、Pillow(PIL)或者Matplotlib库,能够读取和保存各类格式的图像文件。

python

体验AI代码助手

代码解读

复制代码

import cv2
from PIL import Image
import matplotlib.pyplot as plt

# OpenCV读取与保存
img_cv = cv2.imread('image.jpg')  # BGR格式
cv2.imwrite('output.jpg', img_cv)

# Pillow读取与保存
img_pil = Image.open('image.jpg')
img_pil.save('output.jpg')

# Matplotlib读取与显示
img_plt = plt.imread('image.jpg')
plt.imshow(img_plt)

2. 图像颜色空间转换

能够在RGB、BGR、HSV、灰度等不同颜色空间之间进行转换。

python

体验AI代码助手

代码解读

复制代码

# BGR转RGB
img_rgb = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)

# BGR转灰度
img_gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)

# RGB转HSV
import numpy as np
hsv_img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2HSV)

3. 图像裁剪与调整大小

可以对图像进行裁剪、调整尺寸、缩放以及旋转等操作。

python

体验AI代码助手

代码解读

复制代码

# 裁剪
cropped = img_cv[100:300, 200:400]  # 裁剪[y1:y2, x1:x2]

# 调整大小
resized = cv2.resize(img_cv, (500, 300))  # 指定宽高
resized = cv2.resize(img_cv, None, fx=0.5, fy=0.5)  # 按比例缩放

# 旋转
rows, cols = img_cv.shape[:2]
M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1)
rotated = cv2.warpAffine(img_cv, M, (cols, rows))

4. 图像滤波与平滑

可应用各种滤波器来减少噪声或者对图像进行平滑处理。

python

体验AI代码助手

代码解读

复制代码

# 高斯模糊
blur = cv2.GaussianBlur(img_cv, (5, 5), 0)

# 中值滤波(适用于椒盐噪声)
median = cv2.medianBlur(img_cv, 5)

# 双边滤波(保留边缘)
bilateral = cv2.bilateralFilter(img_cv, 9, 75, 75)

5. 边缘检测

能检测图像中的边缘,常见的有Canny边缘检测和Sobel算子。

python

体验AI代码助手

代码解读

复制代码

# Canny边缘检测
edges = cv2.Canny(img_gray, 100, 200)

# Sobel边缘检测
sobelx = cv2.Sobel(img_gray, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(img_gray, cv2.CV_64F, 0, 1, ksize=3)
edges = np.sqrt(sobelx**2 + sobely**2)

6. 阈值处理

通过设定阈值,将图像转换为二值图像。

python

体验AI代码助手

代码解读

复制代码

# 简单阈值
ret, thresh = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)

# 自适应阈值
thresh = cv2.adaptiveThreshold(img_gray, 255, 
                               cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                               cv2.THRESH_BINARY, 11, 2)

# Otsu阈值
ret, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

7. 形态学操作

包括膨胀、腐蚀、开运算和闭运算等形态学操作。

python

体验AI代码助手

代码解读

复制代码

# 定义结构元素
kernel = np.ones((5,5), np.uint8)

# 腐蚀
erosion = cv2.erode(img_gray, kernel, iterations=1)

# 膨胀
dilation = cv2.dilate(img_gray, kernel, iterations=1)

# 开运算(先腐蚀后膨胀)
opening = cv2.morphologyEx(img_gray, cv2.MORPH_OPEN, kernel)

# 闭运算(先膨胀后腐蚀)
closing = cv2.morphologyEx(img_gray, cv2.MORPH_CLOSE, kernel)

8. 直方图处理

可以计算和显示图像的直方图,还能进行直方图均衡化以增强对比度。

python

体验AI代码助手

代码解读

复制代码

# 计算直方图
hist = cv2.calcHist([img_gray], [0], None, [256], [0, 256])

# 直方图均衡化
equ = cv2.equalizeHist(img_gray)

# 自适应直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img_gray)

9. 特征检测与描述

能够检测图像中的关键点并提取特征描述符,如SIFT、SURF、ORB等。

python

体验AI代码助手

代码解读

复制代码

# ORB特征检测
orb = cv2.ORB_create()
keypoints, descriptors = orb.detectAndCompute(img_gray, None)

# 绘制关键点
img_kp = cv2.drawKeypoints(img_gray, keypoints, None, color=(0,255,0), flags=0)

# SIFT特征检测(需要安装opencv-contrib-python)
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img_gray, None)

10. 图像配准与特征匹配

可以匹配不同图像间的特征点,进而实现图像对齐。

python

体验AI代码助手

代码解读

复制代码

# 特征匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)

# 单应性矩阵估计与图像配准
src_pts = np.float32([ kp1[m.queryIdx].pt for m in matches ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in matches ]).reshape(-1,1,2)
H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
aligned = cv2.warpPerspective(img1, H, (img2.shape[1], img2.shape[0]))

11. 轮廓检测与分析

能够检测图像中的轮廓,并计算轮廓的面积、周长等参数。

python

体验AI代码助手

代码解读

复制代码

# 轮廓检测
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
img_contours = img_cv.copy()
cv2.drawContours(img_contours, contours, -1, (0,255,0), 3)

# 轮廓分析
cnt = contours[0]
area = cv2.contourArea(cnt)
perimeter = cv2.arcLength(cnt, True)

12. 图像分割

可将图像分割为不同的区域,如使用GrabCut或 watershed算法。

python

体验AI代码助手

代码解读

复制代码

# GrabCut分割
mask = np.zeros(img_cv.shape[:2], np.uint8)
bgdModel = np.zeros((1,65), np.float64)
fgdModel = np.zeros((1,65), np.float64)
rect = (50,50,450,290)  # ROI区域
cv2.grabCut(img_cv, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img_seg = img_cv*mask2[:,:,np.newaxis]

# Watershed分割
ret, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
kernel = np.ones((3,3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
sure_bg = cv2.dilate(opening, kernel, iterations=3)
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)
unknown = cv2.subtract(sure_bg, sure_fg)

13. 模板匹配

可以在图像中查找特定的模板。

python

体验AI代码助手

代码解读

复制代码

template = cv2.imread('template.jpg', 0)
h, w = template.shape[:2]

# 模板匹配
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

# 获取匹配位置并绘制矩形
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img_cv, top_left, bottom_right, 255, 2)

14. 透视变换与仿射变换

能够对图像进行透视校正和仿射变换。

python

体验AI代码助手

代码解读

复制代码

# 透视变换
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img_cv, M, (300, 300))

# 仿射变换
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img_cv, M, (cols, rows))

15. 傅里叶变换

可用于频域分析和滤波。

python

体验AI代码助手

代码解读

复制代码

# 傅里叶变换
f = np.fft.fft2(img_gray)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))

# 逆傅里叶变换
rows, cols = img_gray.shape
crow, ccol = rows//2, cols//2
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0  # 低通滤波
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)

以上这些技能都是Python图像处理的基础,你可以根据具体需求进行拓展和组合使用。


转载来源:https://juejin.cn/post/7506086607374024730

相关文章
|
存储 数据库 计算机视觉
Python图像处理库:学会Pillow再也不用PS啦
Python图像处理库:学会Pillow再也不用PS啦
195 0
|
机器学习/深度学习 人工智能 算法
图像处理与分析:Python中的计算机视觉应用
【4月更文挑战第12天】Python在计算机视觉领域广泛应用,得益于其丰富的库(如OpenCV、Pillow、Scikit-image)和跨平台特性。图像处理基本流程包括获取、预处理、特征提取、分类识别及重建生成。示例代码展示了面部和物体检测,以及使用GAN进行图像生成。
342 2
|
机器学习/深度学习 存储 监控
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
|
10月前
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
416 20
|
9月前
|
监控 Java 计算机视觉
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
472 1
|
10月前
|
机器学习/深度学习 算法 数据可视化
Python的计算机视觉与图像处理
本文介绍了Python在计算机视觉和图像处理领域的应用,涵盖核心概念、算法原理、最佳实践及应用场景。重点讲解了OpenCV、NumPy、Pillow和Matplotlib等工具的使用,并通过代码实例展示了图像读写、处理和可视化的方法。实际应用包括自动驾驶、人脸识别、物体检测等。未来趋势涉及深度学习、边缘计算和量子计算,同时也讨论了数据不足、模型解释性和计算资源等挑战。
527 2
|
计算机视觉 开发者 Python
利用Python进行简单的图像处理
【10月更文挑战第36天】本文将引导读者理解如何使用Python编程语言和其强大的库,如PIL和OpenCV,进行图像处理。我们将从基本的图像操作开始,然后逐步深入到更复杂的技术,如滤波器和边缘检测。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供新的视角和技能,让你能够更好地理解和操作图像数据。
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
390 7
|
计算机视觉 开发者 Python
使用Python进行简单图像处理
【8月更文挑战第31天】 本文将介绍如何使用Python编程语言来处理图像。我们将通过代码示例来展示如何读取、显示、编辑和保存图像文件。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供一个清晰的指引,帮助你开始自己的图像处理项目。
|
算法 数据可视化 计算机视觉
Python中医学图像处理常用的库
在Python中,医学图像处理常用的库包括:ITK(及其简化版SimpleITK)、3D Slicer、Pydicom、Nibabel、MedPy、OpenCV、Pillow和Scikit-Image。这些库分别擅长图像分割、配准、处理DICOM和NIfTI格式文件、图像增强及基础图像处理等任务。选择合适的库需根据具体需求和项目要求。
531 0