在图像处理中,有时无需对整张图像二值化,仅针对感兴趣区域(ROI)做局部二值化即可满足需求。本文通过极简代码,演示 OpenCV 实现图像局部区域二值化的核心方法,新手可直接复用。

核心代码实现

import cv2 as cv
# 1. 以灰度模式读取图像(参数0)
src = cv.imread("./image/4.bmp", 0)
if src is None:
    print('could not load image')
    exit()
# 2. 调整原始图像窗口大小并显示
cv.namedWindow('src', cv.WINDOW_NORMAL)
cv.resizeWindow("src", 400, 600)
cv.imshow("src", src)
# 3. 选取ROI区域(行:700-1000,列:500-2000)
face = src[700:1000, 500:2000]
# 4. 对ROI区域做固定阈值二值化
ret, binary = cv.threshold(face, 110, 255, cv.THRESH_BINARY)
# 5. 将二值化后的ROI替换回原图
src[700:1000, 500:2000] = binary
# 6. 调整结果窗口大小并显示
cv.namedWindow('outimage', cv.WINDOW_NORMAL)
cv.resizeWindow('outimage', 400, 600)
cv.imshow('outimage', src)
# 7. 等待按键释放资源
cv.waitKey(0)
cv.destroyAllWindows()

关键知识点解析

  1. 灰度读取优化cv.imread参数设为 0,直接读取灰度图,省去cvtColor转灰度步骤,简化代码;
  2. ROI 选取规则src[y1:y2, x1:x2],需注意行(y)在前、列(x)在后,且坐标需在图像尺寸范围内;
  3. 窗口自适应WINDOW_NORMAL + resizeWindow 解决高分辨率图像显示不全问题,适配不同屏幕;
  4. 局部替换逻辑:将二值化后的 ROI 区域重新赋值给原图对应位置,实现 “局部处理、整体保留”。

调优与扩展技巧

  • 阈值调整:110 为自定义阈值,可根据图像明暗调整(值越高,局部黑色区域越多);
  • 二值化模式:替换cv.THRESH_BINARYcv.THRESH_BINARY_INV可实现局部黑白反转;
  • ROI 适配:修改700:1000, 500:2000为目标区域坐标,即可适配不同场景的局部处理。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐