图像预处理1-图像二值化

图像预处理1-图像二值化 什么是图像预处理图像预处理的主要是消除图像中无关的信息提高图像质量增强有关信息的可检测性和最大限度地简化数据从而让后续的特征抽取、图像分割等能够更好地进行图像二值化简单阈值或全局阈值gray cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 // !--把彩色三通道变成单通道即化作为灰度图Gray0.299⋅R0.587⋅G0.114⋅B-- ret, binary cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)ret, binary cv2.threshold(src, thresh, maxval, type)返回值有2个ret本次使用的阈值!--这边是固定的阈值是127--binary处理完成的二值图像参数解释1、src输入图像必须是单通道灰度图8 位 uint8 或 浮点数组2、thresh手动设定的阈值分界值像素以此为分界线判断大小3、maxVal最大阈值一般为255. 注意在THRESH_BINARY / THRESH_BINARY_INV两种模式下生效4、type:阈值类型有五类见下方表格类型大于阈值像素小于等于阈值像素输出特点适用场景THRESH_BINARYmaxval(255)0纯黑白二值白底提取物体THRESH_BINARY_INV0maxval(255)纯黑白反转黑底提取文字THRESH_TRUNCthresh 原值原图不变多灰度、无纯白压制高光过曝THRESH_TOZERO原图不变0保留高亮灰度去除暗部噪点THRESH_TOZERO_INV0原图不变保留暗部灰度去除强光反光运行的代码import cv2 def image_binarization_demo(): # 1. 读取图像 # 注意请将 test.jpg 替换为你电脑里的真实图片名称 # 如果图片和代码在同一文件夹直接写名字即可 image cv2.imread(test.jpg) if image is None: print(错误找不到图片请检查图片路径和名称是否正确) return # 2. 将彩色图像转换为灰度图像 (对应博客第一行代码) #使用的是 RGB2GRAY但在 cv2.imread 默认读取的是 BGR 格式这里用 BGR2GRAY gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 彩色变成灰色单通道Gray0.299⋅R0.587⋅G0.114⋅B # 3. 应用全局阈值进行二值化 # THRESH_BINARY 表示大于127变白(255)小于127变黑(0) ret, final cv2.threshold(gray, 127, 255,cv2.THRESH_TRUNC) print(ret) # 4. 显示处理前后的图像对比 cv2.imshow(Original Image, image) cv2.imshow(Grayscale Image, gray) cv2.imshow(final Image, final) # 5. 等待用户按任意键然后关闭所有窗口 print(请在弹出的图片窗口上按键盘任意键关闭窗口...) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ __main__: image_binarization_demo()运行结果cv2.THRESH_BINARY黑白二值!--图1是原图图2是灰度图图3是二值化图--cv2.THRESH_BINARY_INV黑白二值反转cv2.THRESH_TRUNCcv2.THRESH_TOZEROcv2.THRESH_TOZERO_INV自适应阈值final cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 10 )dst cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)6个参数介绍1、src输入图像必须 单通道灰度图uint82、maxValue: 满足阈值条件后赋值的最大值一般写2553、adaptiveMethod :自适应算法cv2.ADAPTIVE_THRESH_MEAN_C小窗口内像素平均值作为该区域阈值cv2.ADAPTIVE_THRESH_GAUSSIAN_C小窗口内像素高斯加权平均值作为阈值边缘更平滑噪声更少日常首选4、thresholdType: 二值类型cv2.THRESH_BINARY局部大于阈值 → maxValue (255)否则 0cv2.THRESH_BINARY_INV局部大于阈值 → 0否则 255文字提取常用5、blockSize邻域窗口大小规则必须是大于 1 的奇数常用3,5,7,9,11图像细节多、小字3/5大图、纹理粗7/9 本质以当前像素为中心blockSize×blockSize 的方块计算局部阈值6、C 常数偏移量:最终局部阈值 区块计算出来的均值 / 高斯值 − CC0直接用均值当阈值C0阈值整体下调更容易判定为白色物体更容易被保留C0阈值上调更严苛 常用取值2~10运行代码import cv2 def image_binarization_demo(): # 1. 读取图像 # 注意请将 test.jpg 替换为你电脑里的真实图片名称 # 如果图片和代码在同一文件夹直接写名字即可 image cv2.imread(test.jpg) if image is None: print(错误找不到图片请检查图片路径和名称是否正确) return # 2. 将彩色图像转换为灰度图像 (对应博客第一行代码) #使用的是 RGB2GRAY但在 cv2.imread 默认读取的是 BGR 格式这里用 BGR2GRAY gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 彩色变成灰色单通道Gray0.299⋅R0.587⋅G0.114⋅B # 3. 应用全局阈值进行二值化 # THRESH_BINARY 表示大于127变白(255)小于127变黑(0) final cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 10 ) # 4. 显示处理前后的图像对比 cv2.imshow(Original Image, image) cv2.imshow(Grayscale Image, gray) cv2.imshow(final Image, final) # 5. 等待用户按任意键然后关闭所有窗口 print(请在弹出的图片窗口上按键盘任意键关闭窗口...) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ __main__: image_binarization_demo()运行结果全局阈值vs自适应阈值对比维度全局阈值 threshold ()自适应阈值 adaptiveThreshold ()阈值取值全图共用 1 个固定阈值每个局部区块独立生成阈值光照适应性差明暗不均直接失效强完美处理渐变光影、阴影输出图像干净少噪点均匀光细节保留多易产生细小噪点计算速度快较慢典型用途均匀光照扫描图、纯色物体分割手机实拍文字、逆光、阴影图片