1. 数字图像处理基础概念数字图像处理这门课听起来高大上但说白了就是教计算机怎么看懂图片。想象一下你手机里的美颜功能、人脸识别解锁甚至医院里的CT扫描都离不开这门技术。期末考试要考好得先搞清楚几个最基础的概念。首先什么是数字图像咱们可以把一张照片想象成由无数个小格子组成的棋盘每个格子就是一个像素。比如一张800万像素的照片其实就是由800万个不同颜色的小方块拼起来的。这些像素值在计算机里用数字表示比如0代表纯黑255代表纯白中间的数字就是不同深浅的灰色。为什么要处理这些数字图像呢主要三个目的提升视觉效果比如给老照片去划痕、调亮度让模糊的监控录像变清晰提取有用信息像医学CT片中自动识别肿瘤位置或者卫星图片里统计森林面积压缩存储把手机照片从几MB压缩到几百KB还不影响画质举个实际例子我用Python处理过一批医学影像原始图片对比度很低医生根本看不清病灶。用下面这段代码做了个简单的灰度变换效果立竿见影import cv2 import numpy as np def adjust_contrast(img, alpha1.5, beta30): 对比度调整公式new_img alpha * original beta new_img np.clip(alpha * img beta, 0, 255).astype(np.uint8) return new_img medical_img cv2.imread(xray.jpg, 0) # 读取灰度图 enhanced_img adjust_contrast(medical_img)2. 图像采样与量化原理这个知识点考试必考我当年就栽在这道计算题上。简单说采样是把连续图像切成小格子量化是给每个格子里的颜色打分。采样过程就像在图像上画网格。假设我们用100x100的网格采样就是把图像分成1万个小区块。采样越密集比如1000x1000图像越清晰但数据量也越大。这里有个重要公式采样定理告诉我们采样频率必须大于图像最高频率的2倍。举个例子如果要保留图像中1mm的细节采样间隔就得小于0.5mm。量化过程则是给每个像素的颜色打分。8位量化就是把颜色深浅分成256个等级2^8。考试常考这个计算一张1024x768的8位灰度图大小 1024×768×8/8 ≈ 0.75MB同样的24位真彩色图 1024×768×24/8 ≈ 2.25MB我实验室做过对比测试同样尺寸的图片8位量化会出现色阶断层而12位量化4096级就平滑多了。但数据量直接大了50%这就是典型的trade-off。3. 图像增强实战技巧图像增强是考试重点也是项目中最实用的技能。主要分两大类方法3.1 灰度变换线性变换最简单新像素值 a × 原像素值 ba控制对比度b控制亮度。a1增强对比度0a1降低对比度。b0变亮b0变暗。分段线性变换更灵活。比如CT片中只想增强某个组织的对比度def piecewise_linear(img, points): xp, fp zip(*points) # 转折点坐标 return np.interp(img, xp, fp) # 增强中间灰度区域 points [(0,0), (100,30), (150,220), (255,255)] enhanced piecewise_linear(img, points)3.2 直方图处理直方图均衡化是必考大题它的核心思想是把原始图像的直方图拉伸成均匀分布。算法步骤计算原始直方图Pr(r)计算累积分布函数CDF用CDF作为变换函数sT(r)Python实现只要三行def hist_equalize(img): hist cv2.calcHist([img],[0],None,[256],[0,256]) cdf hist.cumsum() return np.interp(img, np.arange(256), 255*cdf/cdf[-1])但实测发现这种方法有时会过度增强背景噪声。改进方法是限制对比度自适应直方图均衡化(CLAHE)clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) enhanced clahe.apply(img)4. 图像滤波与去噪噪声类型和对应的滤波方法是高频考点。常见噪声有高斯噪声用均值滤波椒盐噪声用中值滤波泊松噪声用维纳滤波4.1 空间域滤波均值滤波就像给图像磨皮blur cv2.blur(img, (5,5)) # 5x5均值滤波中值滤波特别适合去除椒盐噪声。原理是把窗口内像素排序取中值median cv2.medianBlur(img, 3)我做过测试对同一张带噪声图像3x3中值滤波比同样尺寸的均值滤波能更好地保留边缘。4.2 频域滤波傅里叶变换是难点但掌握后特别强大。基本流程图像→FFT→频域设计滤波器如理想低通频域相乘IFFT还原图像dft cv2.dft(np.float32(img), flagscv2.DFT_COMPLEX_OUTPUT) dft_shift np.fft.fftshift(dft) # 创建理想低通滤波器 rows, cols img.shape mask np.zeros((rows,cols,2), np.uint8) r 30 # 截止频率 center (rows//2, cols//2) cv2.circle(mask, center, r, (1,1), -1) # 滤波并逆变换 fshift dft_shift * mask f_ishift np.fft.ifftshift(fshift) img_back cv2.idft(f_ishift)5. 图像分割技术图像分割就是把图像分成有意义的区域。常用方法有5.1 阈值分割Otsu算法能自动确定最佳阈值ret, thresh cv2.threshold(img, 0, 255, cv2.THRESH_BINARYcv2.THRESH_OTSU)自适应阈值对光照不均的图像效果更好thresh cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)5.2 边缘检测Canny算子是最经典的edges cv2.Canny(img, 100, 200) # 高低阈值Sobel算子可以检测特定方向的边缘sobelx cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize3) sobely cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize3)6. 期末重点题型解析根据往年试卷高频考点集中在采样量化计算题必考直方图均衡化推导大题空间滤波与频域滤波对比图像分割算法步骤各种变换的数学表达式比如这道经典考题 给定灰度范围[50,150]要线性变换到[0,255]写出变换方程解法a (255-0)/(150-50) 2.55 b 0 - 2.55*50 -127.5 所以 g 2.55*f - 127.5实验题常考完整处理流程比如读取图像→灰度化直方图均衡化中值滤波去噪Canny边缘检测显示各步结果建议把OpenCV常用函数整理成cheatsheet带进考场。比如cv2.imread()的第二个参数0灰度/1彩色/-1原样cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV的区别形态学操作腐蚀cv2.erode()、膨胀cv2.dilate()最后提醒考试时一定要带科学计算器那些傅里叶变换、直方图计算题没有计算器会算到怀疑人生。
数字图像处理:从原理到实战,期末通关全攻略
1. 数字图像处理基础概念数字图像处理这门课听起来高大上但说白了就是教计算机怎么看懂图片。想象一下你手机里的美颜功能、人脸识别解锁甚至医院里的CT扫描都离不开这门技术。期末考试要考好得先搞清楚几个最基础的概念。首先什么是数字图像咱们可以把一张照片想象成由无数个小格子组成的棋盘每个格子就是一个像素。比如一张800万像素的照片其实就是由800万个不同颜色的小方块拼起来的。这些像素值在计算机里用数字表示比如0代表纯黑255代表纯白中间的数字就是不同深浅的灰色。为什么要处理这些数字图像呢主要三个目的提升视觉效果比如给老照片去划痕、调亮度让模糊的监控录像变清晰提取有用信息像医学CT片中自动识别肿瘤位置或者卫星图片里统计森林面积压缩存储把手机照片从几MB压缩到几百KB还不影响画质举个实际例子我用Python处理过一批医学影像原始图片对比度很低医生根本看不清病灶。用下面这段代码做了个简单的灰度变换效果立竿见影import cv2 import numpy as np def adjust_contrast(img, alpha1.5, beta30): 对比度调整公式new_img alpha * original beta new_img np.clip(alpha * img beta, 0, 255).astype(np.uint8) return new_img medical_img cv2.imread(xray.jpg, 0) # 读取灰度图 enhanced_img adjust_contrast(medical_img)2. 图像采样与量化原理这个知识点考试必考我当年就栽在这道计算题上。简单说采样是把连续图像切成小格子量化是给每个格子里的颜色打分。采样过程就像在图像上画网格。假设我们用100x100的网格采样就是把图像分成1万个小区块。采样越密集比如1000x1000图像越清晰但数据量也越大。这里有个重要公式采样定理告诉我们采样频率必须大于图像最高频率的2倍。举个例子如果要保留图像中1mm的细节采样间隔就得小于0.5mm。量化过程则是给每个像素的颜色打分。8位量化就是把颜色深浅分成256个等级2^8。考试常考这个计算一张1024x768的8位灰度图大小 1024×768×8/8 ≈ 0.75MB同样的24位真彩色图 1024×768×24/8 ≈ 2.25MB我实验室做过对比测试同样尺寸的图片8位量化会出现色阶断层而12位量化4096级就平滑多了。但数据量直接大了50%这就是典型的trade-off。3. 图像增强实战技巧图像增强是考试重点也是项目中最实用的技能。主要分两大类方法3.1 灰度变换线性变换最简单新像素值 a × 原像素值 ba控制对比度b控制亮度。a1增强对比度0a1降低对比度。b0变亮b0变暗。分段线性变换更灵活。比如CT片中只想增强某个组织的对比度def piecewise_linear(img, points): xp, fp zip(*points) # 转折点坐标 return np.interp(img, xp, fp) # 增强中间灰度区域 points [(0,0), (100,30), (150,220), (255,255)] enhanced piecewise_linear(img, points)3.2 直方图处理直方图均衡化是必考大题它的核心思想是把原始图像的直方图拉伸成均匀分布。算法步骤计算原始直方图Pr(r)计算累积分布函数CDF用CDF作为变换函数sT(r)Python实现只要三行def hist_equalize(img): hist cv2.calcHist([img],[0],None,[256],[0,256]) cdf hist.cumsum() return np.interp(img, np.arange(256), 255*cdf/cdf[-1])但实测发现这种方法有时会过度增强背景噪声。改进方法是限制对比度自适应直方图均衡化(CLAHE)clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) enhanced clahe.apply(img)4. 图像滤波与去噪噪声类型和对应的滤波方法是高频考点。常见噪声有高斯噪声用均值滤波椒盐噪声用中值滤波泊松噪声用维纳滤波4.1 空间域滤波均值滤波就像给图像磨皮blur cv2.blur(img, (5,5)) # 5x5均值滤波中值滤波特别适合去除椒盐噪声。原理是把窗口内像素排序取中值median cv2.medianBlur(img, 3)我做过测试对同一张带噪声图像3x3中值滤波比同样尺寸的均值滤波能更好地保留边缘。4.2 频域滤波傅里叶变换是难点但掌握后特别强大。基本流程图像→FFT→频域设计滤波器如理想低通频域相乘IFFT还原图像dft cv2.dft(np.float32(img), flagscv2.DFT_COMPLEX_OUTPUT) dft_shift np.fft.fftshift(dft) # 创建理想低通滤波器 rows, cols img.shape mask np.zeros((rows,cols,2), np.uint8) r 30 # 截止频率 center (rows//2, cols//2) cv2.circle(mask, center, r, (1,1), -1) # 滤波并逆变换 fshift dft_shift * mask f_ishift np.fft.ifftshift(fshift) img_back cv2.idft(f_ishift)5. 图像分割技术图像分割就是把图像分成有意义的区域。常用方法有5.1 阈值分割Otsu算法能自动确定最佳阈值ret, thresh cv2.threshold(img, 0, 255, cv2.THRESH_BINARYcv2.THRESH_OTSU)自适应阈值对光照不均的图像效果更好thresh cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)5.2 边缘检测Canny算子是最经典的edges cv2.Canny(img, 100, 200) # 高低阈值Sobel算子可以检测特定方向的边缘sobelx cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize3) sobely cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize3)6. 期末重点题型解析根据往年试卷高频考点集中在采样量化计算题必考直方图均衡化推导大题空间滤波与频域滤波对比图像分割算法步骤各种变换的数学表达式比如这道经典考题 给定灰度范围[50,150]要线性变换到[0,255]写出变换方程解法a (255-0)/(150-50) 2.55 b 0 - 2.55*50 -127.5 所以 g 2.55*f - 127.5实验题常考完整处理流程比如读取图像→灰度化直方图均衡化中值滤波去噪Canny边缘检测显示各步结果建议把OpenCV常用函数整理成cheatsheet带进考场。比如cv2.imread()的第二个参数0灰度/1彩色/-1原样cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV的区别形态学操作腐蚀cv2.erode()、膨胀cv2.dilate()最后提醒考试时一定要带科学计算器那些傅里叶变换、直方图计算题没有计算器会算到怀疑人生。