如何在OpenCV中实现Leptonica的pixReduceRankBinary2与pixCloseBrick功能
OpenCV 等效实现方案
1. pixReduceRankBinary2 对应实现
Leptonica 中该函数的作用是对二值图像做2倍降采样:遍历每个2x2的滑动窗口,当窗口内前景像素数量≥指定rank值时,输出对应降采样位置的像素为前景。你传入的rank为2,即2x2窗口中至少有2个前景像素时才保留前景,连续调用两次等价于累计做4倍降采样。
OpenCV 没有直接对应的原生接口,可通过以下自定义函数实现完全等效的逻辑:
import cv2 import numpy as np def reduce_rank_binary_2x2(bin_img, rank=2): # bin_img 为输入二值图,支持0/1或0/255取值 foreground_val = 255 if bin_img.max() > 1 else 1 # 计算2x2窗口内的前景像素和 sum_kernel = np.ones((2, 2), dtype=np.uint8) window_sum = cv2.filter2D(bin_img, -1, sum_kernel, borderType=cv2.BORDER_CONSTANT) # 筛选满足rank要求的像素 rank_res = (window_sum >= rank * foreground_val).astype(np.uint8) * foreground_val # 执行2倍降采样,取每个窗口的左上角点位 return rank_res[::2, ::2] # 对应原代码的两次调用 img = reduce_rank_binary_2x2(img, 2) img = reduce_rank_binary_2x2(img, 2)
如果对精度要求不高,也可以直接调用cv2.pyrDown()做近似的2倍降采样,性能会更好。
2. pixCloseBrick 对应实现
该函数就是使用指定尺寸的矩形(砖形)结构元执行形态学闭运算,OpenCV有原生对应接口,你传入的参数2、3对应宽度为2、高度为3的矩形核,实现代码如下:
# 生成2x3的矩形结构元 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 3)) # 执行闭运算,等价于pixCloseBrick img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
注意:所有操作均需要保证输入图像为二值图,若输入为灰度图需要先通过
cv2.threshold()做二值化处理。
内容的提问来源于stack exchange,提问作者Joe Cabezas
相关产品推荐
相关产品推荐

