首页 / 资讯中心 / 文章详情

数字图像处理入门:从像素采样到OpenCV实战

数字图像处理入门:从像素采样到OpenCV实战 ★ FEATURED ARTICLE
第一次接触数字图像处理是在一门研究生选修课上。当时导师只丢给我一张拍糊了的图书馆照片说“把这个弄清晰一点”。我对着屏幕发了好一会儿呆然后才意识到一个简单的事实我连“图像”这两个字在电脑里到底意味着什么都没有真正理解。后来我才明白从那一刻起我已经踏入了一个既古老又年轻的领域——数字图像处理。这个领域远没有听起来那么高冷。你每天用手机拍照、扫码付款、人脸解锁、给照片加滤镜背后全是图像处理在干活。如果你是刚入门的学生、转行做视觉开发的工程师或者只是好奇“电脑怎么认识图片”的爱好者这篇文章都能给你一个落脚点。我会从最基础的概念讲起用比较通俗的方式把采样、量化、像素、色彩空间这些绕不开的名词说清楚再带你把环境搭起来亲手跑通第一个图像处理程序。整个过程不需要数学基础不需要深厚的编程功底只需要你愿意动手试。1. 数字图像处理到底在干什么从一张照片说起1.1 图像的数字本质一张照片就是一堆数字很多人第一次听到“数字图像”会觉得抽象其实一句话就能说透数字图像就是用一个二维数组来存储的亮度信息矩阵。拿最经典的黑白照片举例。照片上有亮有暗电脑不认识“亮”和“暗”它只认识数字。于是我们把照片横向切成M份纵向切成N份得到一个M行N列的小格子阵列每个格子里填一个数字代表这个格子的亮度。这个格子术语叫“像素”这一大块数字阵列就是电脑眼里的图像。可以类比一下如果用方格纸临摹一幅画每个格子里只记录“这里深一点还是浅一点”涂完之后一格一格连起来看原画的大致轮廓就出来了。格子越密轮廓越清楚——这就是数字图像的基本原理没有更复杂的东西了。到了彩色图像逻辑也一样只是每个像素不再只存一个数字而是存三个红、绿、蓝三个通道各自的亮度值。这三个值按不同比例混合就能组合出我们肉眼看到的所有颜色。所以一张彩色图本质上是三个二维数组叠在一起。理解这一点很重要。后面你做任何图像处理操作比如调亮度、加模糊、识别边缘最终都是在和这个数字矩阵打交道。很多初学者卡在各种算法里出不来就是因为忘了这层本质。1.2 采样与量化从连续世界到数字世界的关键一跳图像从现实世界进入电脑要经历两个步骤一个是采样一个是量化。采样解决的是“把空间切碎”的问题。现实世界的画面是连续变化的光影过渡非常平滑但电脑没有能力直接存储这种无限连续的信息只能隔一段距离取一个点。就像你用温度计测室温不可能记录每一瞬间的温度变化只能每隔五分钟记一次。这个取点的过程就是采样。量化解决的是“把亮度分级”的问题。取完点之后每个点的亮度还是一个连续值比如某个点的亮度精确值是128.37电脑存不了这么多小数就把它近似成最接近的整数。常见做法是分成256级用0表示纯黑255表示纯白中间的数字表示不同深浅的灰。这个把连续亮度映射成有限等级的过程就是量化。这里有个很直观的体会采样密度越高图像细节越丰富量化等级越多图像层次越细腻。两者决定了图像的质量天花板。但你也会发现一个矛盾——采样越密、量化越细数据量就越大。一张千万像素的照片原始数据量大得惊人所以才需要后面的压缩技术。初学阶段你只需要牢牢记住采样和量化是图像数字化的两个基本动作后面学图像增强、图像恢复时很多问题都会追溯到这两个环节。1.3 像素、分辨率与灰度级三个绕不开的基础概念这三个词是数字图像处理最少不了的底层概念我分开说。像素是图像的最小单位就是前面说的一个小格子。一张图有多少像素通常用“宽×高”表示比如1920×1080意思就是横向1920个格子纵向1080个格子总计约207万个像素。分辨率描述的是图像细节的精细程度。它有两种理解方式一种是像素总数即一张图像有多少像素另一种是空间分辨率表示单位长度内有多少像素比如一英寸300个像素常说的300 DPI。初学者最容易混淆的就是这里——像素总数多不等于打印出来就清晰还得看物理尺寸上怎么分布。同样1000×1000的图打印在1寸见方和打印在10寸见方清晰度完全不是一个概念。灰度级就是量化时亮度分了几个等级。8位灰度图有256级16位灰度图有65536级。人眼对灰度的分辨能力大约在几十到上百级之间所以256级对大多数场景足够了。过度追求高灰度级人眼看不出差别但数据量和计算开销却实实在在成倍增长。这三个概念直接决定了图像的存储容量。只看灰度图的话一张M×N的图像需要M×N个字节如果是彩色RGB三通道就需要3×M×N个字节。算一笔账一张1024×1024的彩色图原始数据量是1024×1024×3字节约3MB。这就是为什么传输图片需要压缩——原图实在太“胖”了。2. 数字图像处理能解决什么问题应用场景与价值2.1 你手机里每天都在发生的图像处理你可能没意识到手机拍照的瞬间图像处理已经跑了无数个来回。按下快门的一瞬间传感器拿到原始数据第一件事就是去马赛克——因为相机传感器每个像素只能感光一种颜色需要通过插值还原出完整的RGB信息。接着是白平衡调整、去噪、锐化、色彩增强每一步都是典型的图像处理算法。美颜相机就更典型了。磨皮本质上是低通滤波把面部的细小纹理和高频噪声抹掉瘦脸则是图像几何变换对局部区域做位移和形变而各种滤镜要么是调整亮度曲线要么是调整色相饱和度。你自己拍照时可能只花一秒钟但背后跑的是十几个处理模块。扫码支付也是图像处理的重头戏。二维码能稳定识别靠的是二值化、几何校正、网格划分等一整套处理流程。如果二维码拍歪了、光线太暗了、有反光都需要预处理来修正。你扫一次码背后就是一次完整的图像处理流水线。人脸解锁又往前走了一步。它先通过图像处理把脸部区域定位出来再提取特征点。光线变化、戴眼镜、换个发型这些干扰都要靠图像预处理来抵消。虽然最终决策部分是机器学习在干活但前置的图像处理环节如果做得不好后面的模型再强也白搭。2.2 工业、医疗与科研中的硬核应用消费场景只是冰山一角图像处理在严肃领域的作用更值得了解。医疗影像是图像处理最经典的应用之一。CT、MRI这些设备产生的本来就是数字图像医生看片子其实是在看经过重建、增强后的图像。图像去噪能让病灶边界更清楚图像增强能突出微小的异常区域。还有一些辅助诊断系统会自动标注可疑的结节或阴影靠的仍然是图像处理定位特征。工业质检是另一个大规模应用场景。生产线上的产品通过高速相机拍下照片系统实时检查有没有划痕、缺损、错位。这种检测最核心的就是图像处理中的边缘检测、模板匹配和形态学操作。一个螺丝拧没拧到位、一个瓶盖有没有压紧传统人工目检又慢又容易疲劳机器视觉系统可以毫秒级完成判断。遥感影像处理也在持续发挥作用。卫星拍下来的照片需要经过几何校正、辐射校正、图像拼接才能使用。植被覆盖分析、水体变化监测、城市扩张研究都是从这些处理过的遥感图像开始的。科研领域更不用多说——从显微镜下细胞图像的自动分析到天文望远镜拍摄星云的重建增强图像处理几乎是所有视觉相关研究的底层基础设施。2.3 数字图像处理和计算机视觉的边界有个问题初学者经常问数字图像处理和计算机视觉有什么区别我一开始也分不清后来被导师一句话点醒图像处理的输入输出都是图像而计算机视觉的输入是图像、输出是理解结果。图像处理是把一张图变成另一张图。你把模糊的照片变清晰输入是模糊图输出是清晰图你把彩色图变灰度图输入彩色的输出灰白的。图进图出这是数字图像处理的本质。计算机视觉则不一样。它要做的是从图像里“读出信息”并做出决策。人脸识别输入是一张脸输出是“这是谁”的判断自动驾驶检测车道线输入是道路图像输出是“车道在哪”的坐标信息。输出不再是一张图像而是一个语义层面的结论。当然两者不是对立关系而是流水线的关系。计算机视觉系统通常先依赖图像处理做预处理把图像质量提上来、把关键区域标出来然后再用机器学习或深度学习模型做识别判断。所以从数字图像处理入门也是通往计算机视觉的一条必经之路它帮你建立的像素级直觉在后面的深度学习时代依然非常有用。3. 图像在电脑里是怎么存的色彩空间与文件格式3.1 三种必须搞清楚的色彩空间色彩空间简单说就是颜色的一种数学表示方式。同一个颜色可以用不同坐标系来描述。图像处理里最常见的三种你最好一次搞清楚。RGB色彩空间是最直观的。红、绿、蓝三原色按不同亮度叠加组成各种颜色。电脑屏幕就是用这种方式发光的所以显示器的输出都是RGB。RGB的好处是符合显示设备的物理特性坏处是它和人眼的感知方式不太匹配——你对着一张偏黄的图很难直接说出“红色要减多少、绿色要加多少”。灰度空间其实是把彩色信息丢掉只保留亮度。灰度图只有一个通道每个像素一个值0到255代表从黑到白。很多图像处理算法的前置条件就是先把图像转成灰度因为灰度处理计算量小而且能避开颜色带来的干扰。HSV色彩空间则更接近人眼的感知逻辑。H是色相代表什么颜色S是饱和度代表颜色浓不浓V是明度代表亮不亮。做颜色筛选时HSV非常好用。比如你想把画面里的红色物体找出来在RGB里很难给出一个稳定的范围但在HSV里只需要限定H在某个区间就行。有个小表格可以帮你快速对比色彩空间通道组合核心优势典型用途RGBR、G、B符合显示设备图像存储、屏幕显示灰度单通道亮度计算量小、易处理边缘检测、形态学操作HSVH、S、V符合人眼感知颜色分割、目标检测3.2 文件格式的取舍BMP、JPEG、PNG你打开电脑里的图片后缀名可能是jpg、png也可能遇到bmp。这些格式各有各的存储策略理解它们的取舍能帮你避免不少存储和传输上的麻烦。BMP格式是最原始的无压缩格式。它把图像矩阵原封不动写进文件优点是处理简单、图像毫无损失缺点是文件巨大。一张1024×1024的彩色图BMP文件基本就是3MB往上。这种格式现在主要用于教学演示和某些对兼容性要求极高的场景日常使用已经很少见了。JPEG格式是压缩高手。它采用有损压缩利用人眼对高频细节不敏感的特性省掉一部分视觉上不太重要的信息换来极高的压缩比。同一张照片BMP可能要3MBJPEG可能只要300KB画质还看不出明显差异。代价是反复保存JPEG会累积画质损失所以JPEG适合存储最终结果不适合作为中间处理载体。PNG格式是平衡派。它用无损压缩画质零损失但压缩率不如JPEG高。PNG还支持透明通道这在网页设计、图标制作里是刚需。做图像处理实验时需要保存中间结果建议用PNG因为它不会因为反复读写而劣化。选格式的本质是权衡到底要文件小还是要画质精没有绝对答案取决于你的具体场景。我的建议是照片存JPEG处理中间过程存PNG教学演示和绝对无损场景才用BMP。3.3 入门工具选型OpenCV、MATLAB、Pillow各有千秋工具选型是很多新手纠结的问题。我用过不止一种工具可以给你一个比较务实的参考。OpenCV是目前工业界和学术界事实上的标准。它功能极其全面从基本的读写、滤波、形态学到特征提取、相机标定、光流跟踪几乎应有尽有。性能也经过高度优化实时处理视频没问题。支持C和Python两套接口我用Python配合OpenCV做原型特别顺手。缺点是函数命名偏工程化逻辑复杂时初学者容易迷路。MATLAB在高校教学中非常流行。它的矩阵操作天然契合图像处理很多教科书里的算法用MATLAB几行就写完。它的可视化做得也很好处理过程中能方便地查看每一步的中间结果。缺点是商业软件授权贵、执行效率不如C实现而且脱离学术环境后实际工程中很少直接用MATLAB做产品。**PillowPIL**是我最推荐的新手入门工具。它非常轻量安装简单代码风格友好。做图像的打开、裁剪、旋转、调色这类基础操作用Pillow体验极好。缺点是处理复杂算法时力不从心卷积、滤波、特征检测这些高级功能它基本没有。三者的定位可以这样理解Pillow负责带你入门、搞定简单任务OpenCV负责陪你走进实战、应付真正的项目MATLAB负责帮你理解算法原理、快速验证想法。如果让我给新手一个明确的路径我会说先用Pillow玩一周然后直接跳到OpenCV开始系统学习。这个路径最省时间也最顺理成章。4. 数字图像处理的四大类基本操作4.1 点运算每个像素自己说了算点运算是最基础也是最好理解的一类图像处理操作。它的核心思想是输出图像上每个像素的值只由输入图像上同一个位置的像素值决定跟周围的像素没关系。最简单的点运算是亮度调整。比如你想把图像调亮一些就把每个像素值都加上一个固定值输出像素值 输入像素值 30这个过程就是“遍历所有像素挨个加30”。听起来很简单但有个坑如果输入像素值原本是240加完30变成270超出了8位图像允许的最大值255。这时候如果直接截断像素就变成纯白细节全没了。合理的做法是做饱和运算超过255按255算低于0按0算。另一个经典的点运算是二值化。给一个阈值像素值大于阈值的设成255小于阈值的设成0。这样图像就变成纯黑白的“二值图”背景和前景被彻底分离开来。这在很多场景下非常有用比如OCR文字识别前先要把彩色文档转成清晰的黑白文字图。点运算虽然简单但它是很多复杂算法的基石而且逻辑清晰、容易调试。初学图像处理强烈建议先把点运算玩透你会对“图像是矩阵”这句话有更深刻的体会。4.2 邻域运算卷积与滤波是核心如果说点运算是单兵作战那邻域运算就是“拉帮结派”。输出图像的每个像素值不仅取决于自己还取决于周围一圈邻居。这是图像处理中最强大的工具之一几乎所有重要的效果——模糊、锐化、边缘检测——都是邻域运算的产物。邻域运算的实现机制叫卷积。简单说就是用一个小的矩阵叫卷积核或滤波器在图像上滑动每滑动到一个位置把卷积核和它覆盖的那一小块像素对应相乘、再全部加起来作为输出图像对应位置的值。举个例子最常用的3×3均值滤波核1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9它做的事情是每个像素的值取自己和周围8个邻居的平均值。这一平均图像里那些突兀的亮点和暗点就被钝化了这就是模糊效果的来源。卷积核越大参与平均的像素越多模糊越严重。再说边缘检测Sobel算子就是另一套卷积核。它在横向和纵向分别计算像素值的变化率变化剧烈的地方就是边缘。一个像素所在位置如果和邻居差别很大卷积结果就很大如果和周围差不多结果就接近0。边缘检测的底层逻辑就是这么朴素。我见过很多初学者一看到卷积就发怵觉得数学很难。其实你只要亲手写一次卷积的循环代码跑一张图试试效果瞬间就明白了。卷积不是玄学它就是“拿一个小窗移来移去算加权求和”。4.3 几何变换让图像换个姿势几何变换处理的是图像的空间位置关系而不是像素亮度。它做的事情包括缩放、旋转、平移、翻转这些操作本质是重新排列像素的位置。缩放是最常见的几何变换。放大图像时原来的像素不够用就需要在像素之间“插值”生成新像素。最简单的方法是最近邻插值直接复制最近的像素速度快但锯齿严重效果好一些的是双线性插值考虑周围四个像素按距离加权边缘平滑很多最高级的是双三次插值效果更好但计算量大不少。实操中一般场景双线性就够了。旋转变换也很有讲究。图像旋转90度、180度是简单的像素搬移但如果要旋转任意角度就需要计算每个目标像素在原始图像中的对应位置然后插值取数。旋转过程中还会遇到图像边界出现空白的问题需要决定是用黑色填充、复制边缘、还是镜像填充。这些细节在图像拼接、文档校正时都会遇到。几何变换看起来不起眼但在实际项目中无处不在。扫码识别的第一步往往就是透视校正自动驾驶的道路矫正也离不开几何变换。它是图像处理的“基本功底”值得花时间练熟。4.4 频域处理换个角度理解图像频域处理可能是初学者最望而生畏的部分因为要接触傅里叶变换。但你先别被数学公式吓跑我试图用最直观的方式说明它。图像可以看作一个亮度随空间位置变化的信号平缓渐变的地方是低频剧烈变化的地方是高频。如果把图像转换到频域就能看到哪些频率成分占据了主导。傅里叶变换干的就是这件事——它把图像从“空间域”翻译成“频率域”。频域最大的好处是有些在空间域很难实现的操作在频域里变得异常简单。比如去噪图像里的噪声通常对应高频成分想去除噪声只需在频域里把高频部分抑制掉再转换回空间域。这比在空间域里设计复杂的滤波器要直观得多。用生活类比来理解想象一段音乐里面的低音鼓点和高音小提琴混在一起。如果你想把刺耳的高音降下去直接在时间轴上逐点处理很麻烦但如果你先把音乐分解成不同频率的频谱找到高频段直接把音量调小就轻松多了。频域处理图像就是这个逻辑。初学阶段你不一定需要精通频域算法的数学推导但至少要知道它在图像处理的工具箱里占据了什么位置。等你后面做图像恢复、图像压缩或者某些特殊滤波时会发现自己对频域的理解越来越有用。5. 第一次实操用Python打开一张图像并做点处理5.1 环境准备装好OpenCV前面聊了这么多概念现在终于可以动手了。我推荐用Python加上OpenCV的组合这是目前最主流、资料最丰富的入门配置。打开终端执行下面的安装命令pip install opencv-python一条命令就够了。装好之后你可以验证一下能不能正常导入import cv2 print(cv2.__version__)如果顺利输出版本号说明环境没问题。我还建议同时安装matplotlib后面做图像显示和对比会很方便pip install matplotlib在这段准备工作中最常见的坑是Python环境混乱。我见过很多新手在系统自带的Python和Anaconda之间折腾半天装好了OpenCV却导入失败。如果你遇到这个问题最简单的办法是用虚拟环境隔离——创建一个只属于这个项目的环境所有依赖都在里面装互不干扰。另外准备一张测试图片最好是内容比较丰富的照片比如街景、人像、或者你书桌上的杂物都行。初学者用一张内容单一的纯色图很难看出处理效果差异。5.2 第一个程序读取、转换、模糊、二值化一条龙环境搞定后我们来写第一个真正的图像处理程序。不要急一行一行理解import cv2 import matplotlib.pyplot as plt # 1. 读取图像 img cv2.imread(test.jpg) print(原始图像尺寸, img.shape) # (高度, 宽度, 通道数) # 2. 转换为灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 3. 高斯模糊 blurred cv2.GaussianBlur(gray, (5, 5), 0) # 4. 二值化 _, binary cv2.threshold(blurred, 128, 255, cv2.THRESH_BINARY) # 5. 缩放图像到指定尺寸 resized cv2.resize(img, (400, 300), interpolationcv2.INTER_LINEAR) # 6. 保存结果 cv2.imwrite(binary_output.png, binary) cv2.imwrite(resized_output.jpg, resized)这个程序做了六件事读图、转灰度、模糊、二值化、缩放、保存。每一步都是入门必会的基本功。你可能会注意到我把图像转灰度时用的是COLOR_BGR2GRAY而不是COLOR_RGB2GRAY。这是初学者最容易踩的坑——OpenCV读取图像时内部存储顺序是蓝色、绿色、红色不是我们通常说的RGB。写代码时如果搞错了通道顺序颜色会变得很奇怪。想要看到处理效果可以用matplotlib显示plt.figure(figsize(10, 8)) plt.subplot(2, 2, 1) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.title(原始图像) plt.subplot(2, 2, 2) plt.imshow(gray, cmapgray) plt.title(灰度图) plt.subplot(2, 2, 3) plt.imshow(blurred, cmapgray) plt.title(高斯模糊) plt.subplot(2, 2, 4) plt.imshow(binary, cmapgray) plt.title(二值化) plt.show()这里我用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)把图像转回来再显示是因为matplotlib默认按RGB顺序解释图像不转的话显示的图像红色和蓝色会调换。5.3 保存结果与参数调整技巧程序跑通之后我强烈建议你玩一玩参数调整这是加深理解最好的方式。先说高斯模糊的参数。GaussianBlur的第一个参数是图像第二个是卷积核大小第三个是标准差。把卷积核从(5, 5)改成(21, 21)重新跑一遍你会发现图像明显更糊了。多试几个值你就能直观感受“卷积核越大模糊越强”这个规律。再说二值化的阈值。阈值从128改成200二值化后剩下的白色区域会明显减少因为更多的像素值小于200被判成了黑色阈值改成60白色区域则会大量增加。这种“调一个参数、看一张图”的体验比看十页理论都管用。保存结果时还有个细节cv2.imwrite函数会根据文件后缀名自动选择编码格式。后缀是.jpg就走JPEG压缩后缀是.png就走PNG压缩。前面说的格式选择问题在这里就会实际遇到。你如果反复保存JPEG并比较画质会发现图片越来越“脏”这就是有损压缩的损耗累积。6. 新手常见问题排查速查表6.1 读取图像失败路径与格式的坑新手最常见的报错是cv2.imread返回了None程序后面的操作全部崩掉。原因基本集中在两个地方。第一个是路径问题。相对路径找不到文件是最典型的情况——代码里写cv2.imread(test.jpg)但test.jpg根本不在程序运行目录下。排查方法是先用os.getcwd()看看当前工作目录在哪然后确认图片确实在那个目录里。最简单的办法是用绝对路径虽然不够优雅但不会出错。第二个是文件名问题。OpenCV读取文件路径时如果包含中文有些版本的OpenCV会直接返回None不会报错也不会警告。我的建议是所有图片文件和项目文件夹统一用英文命名。不要跟这个特性较劲用英文能省掉很多没意义的调试时间。另外imread读取时还可以带一个参数控制读取方式。cv2.imread(path, cv2.IMREAD_GRAYSCALE)会直接把图片读取为灰度图省掉一次cvtColor调用cv2.IMREAD_COLOR是默认行为读成三通道彩色图。需要透明通道时用cv2.IMREAD_UNCHANGED可以保留Alpha信息。这些细节平时用不太到但遇到特殊需求时非常有用。6.2 颜色不对BGR与RGB的经典误区这是我见过最多人踩的坑而且几乎每个学OpenCV的人都会碰到一次。症状是用OpenCV读图再用matplotlib显示结果图像里的天空变成了橙色、草地变成了紫色。原因一句话就能说清OpenCV内部用BGR顺序存储彩色图像而matplotlib按RGB顺序解释图像。两者不一致红色和蓝色就互换位置了。解决办法有两个。一个是显示前主动转换rgb_img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)另一个是用OpenCV自带的窗口显示它内部会自动处理顺序问题cv2.imshow(Window, img) cv2.waitKey(0) cv2.destroyAllWindows()我自己早期在这个坑上浪费过不少时间明明代码看起来完全“正确”结果图就是不对劲。你要记住用matplotlib显示OpenCV读的图必须先做通道转换。这句话值好几晚上的调试。6.3 结果全黑或全白阈值、数据类型与显示问题有时候程序跑完了输出的图像全是一片黑或一片白看起来像是处理失败其实多半是数据范围或显示方式的问题。先说二值化全黑。如果整幅图像都是黑色先检查阈值是不是设得太高了。比如图像整体偏暗大部分像素亮度在100以下阈值设成200所有像素都被判定为黑色结果自然一片黑。反过来阈值设得太低全部判定为白色就变成全白。再说数据处理类型的问题。OpenCV的像素值范围是0到255数据类型是8位无符号整数。如果你做了一个操作比如给每个像素加上一个浮点数的偏移量结果数组变成了浮点类型。浮点型数组在用imwrite保存或imshow显示时会被解释为0到1范围的标准值超过1的数值全部变成白点负值全部变成黑点图像就会看起来严重失真甚至全是白的。正确做法是处理完数据后用cv2.convertScaleAbs或astype把数据转回8位无符号类型。灰度图显示成“彩色”也是高频问题。如果你用matplotlib的imshow显示灰度图时不指定cmapgraymatplotlib会默认用颜色映射colormap来渲染单通道图像。这时画面会出现绿紫相间的伪彩色看着不像灰度图但其实你的数据没有错只是显示方式不对。指定cmapgray就恢复正常了。我把这些常见问题整理成表格方便你遇到问题时快速对照问题现象可能原因排查与解决imread返回None路径错误或文件名含中文用绝对路径项目文件和图片用英文命名用matplotlib显示颜色异常BGR顺序未转为RGB显示前调用COLOR_BGR2RGB转换二值化结果全黑或全白阈值设置不合理先查看图像亮度直方图再选定阈值处理后图像花屏/全亮数据类型仍是浮点保存或显示前转回uint8类型灰度图显示成伪彩色plt.imshow未指定cmap添加cmapgray参数图像保存后很模糊JPEG有损压缩叠加中间结果保存用PNG格式玩过一轮图像处理之后你有机会发现它的门槛其实比想象中低很多。把图像理解成一个矩阵把各种操作理解成拿不同的规则去修改这个矩阵一切就通透了。我自己刚学那会儿光是搞清楚BGR和RGB的区别就折腾了好几天后来又花了很久才弄明白卷积为什么能模糊图像。回头看最大的弯路是把问题想复杂了。数字图像处理看着像数学其实更接近一门手艺——理论概念不必背得滚瓜烂熟亲手调一次参数、亲眼看到效果变化比什么都记得牢。所以接下来你要做的就是别停手找一张自己喜欢的照片把这些基本操作都跑一遍改改参数、换换图片、看看效果。遇到问题就翻一翻前面的排查表然后继续做下去。基础打牢之后后面不管是做深度学习图像分类还是做更复杂的视觉项目你都会比别人更稳。
阅读完成 · 觉得有帮助?
咨询建站