opencv学习十二:超大图像二值化

超大图像的二值化方法

分块处理超大图像的二值化问题
  (1) 全局阈值处理
  (2) 局部阈值(效果更好)
空白区域过滤
先缩放进行二值化,然后还原大小

分块处理超大图像的二值化问题

import cv2 as cv
import numpy as np

def big_image_binary(image):
    print(image.shape) #图像大小
    ch, cw = 255, 255  #每个小块的高和宽
    h, w = image.shape[:2]#整个图像高,宽
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #进行二值化必须先转成灰度图
    for row in range(0, h, ch):#遍历每一小块高
        for col in range(0, w, cw):#遍历每一块宽
            roi = gray[row:row+ch, col:col+cw] #获取分块
            mean, std = cv.meanStdDev(roi)
            print("the picture mean:%s, std:%s" % (mean, std)) #打印小块均值,方差
            # ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  #全局阈值
            dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 10) #局部阈值
            gray[row:row+ch, col:col+cw] = dst #对每个个块进行二值化处理
    cv.imwrite("binary2.jpg",gray)


src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/xiannvbang.jpg")
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述每个小分块使用全局阈值,由于噪声的影响,会使得出现先红色方块的阴影,效果比较差

局部阈值

dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 10)

代码截图:
在这里插入图片描述局部阈值的效果就比较好,因为局部阈值中有个C值,可以去除一些噪音

空白区域过滤

import cv2 as cv
import numpy as np

def big_image_binary(image):
    ch, cw = 200, 200  #分块每个块的大小
    h, w = image.shape[:2]
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #转成灰度图
    for row in range(0, h, ch):
        for col in range(0, w, cw):
            roi = gray[row:row+ch, col:col+cw]
            mean, std = cv.meanStdDev(roi)
            print("the picture mean:%s, std:%s" % (mean, std))
            if std < 10 and mean > 80: #如果标准差小于10或者均值大于80,将此处的值设为255
                gray[row:row + ch, col:col + cw] = 255
            else:
                ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  #全局阈值
                gray[row:row+ch, col:col+cw] = dst #对每个个块进行二值化处理
    cv.imshow("binary", gray)


src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/xiannvbang.jpg")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()

先缩放,再进行二值化

图片缩放函数 cv.resize

 resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

src :输入,原图像,即待改变大小的图像;
dst: 输出,改变后的图像。这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;
dsize:输出图像的大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定的大小;如果这个参数为0,那么下面的公式来计算:
dsize = Size(round(fxsrc.cols), round(fysrc.rows))
其中,fx和fy就是下面要说的两个参数,是图像width方向和height方向的缩放比例。
fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;
fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;
interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:
INTER_NEAREST - 最邻近插值
INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
INTER_CUBIC - 4x4像素邻域内的双立方插值
INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

numpy 知识补充

np.mean() 返回数组元素的平均值
np.std()  返回数组元素的标准差
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值