【OpenCv】(python)超大图像的二值化方法(空白过滤)

39 篇文章 9 订阅
30 篇文章 5 订阅

超大图像的二值化方法

(1).可以采用分块方法,

(2).先缩放处理就行二值化,然后还原大小

1、局部阈值、全局阈值

import cv2 as cv
import numpy as np

"""
def big_image_binary(image):
    print(image.shape)  #(4208, 2368, 3)  #超大图像,屏幕无法显示完整
    cw,ch = 256,256
    h,w = image.shape[:2]
    gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY)   #要二值化图像,要先进行灰度化处理
    for row in range(0,h,ch):
        for col in range(0,w,cw):
            roi = gray[row:row+ch,col:col+cw]   #获取分块
            #全局阈值
            # ret,binary = cv.threshold(roi,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
           

            #局部阈值  
            binary = cv.adaptiveThreshold(roi,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,127,20)  
            gray[row:row + ch, col:col + cw] = binary  #分块覆盖
            print(np.std(binary),np.mean(binary))

    cv.imwrite("binary2.jpg",gray)

“”"

2、空白区域过滤

#空白区域过滤
def big_image_binary(image):
    print(image.shape)
    # 分成小块,每一块的宽高
    cw = 256
    ch = 256
    #整个图像的宽高
    h, w = image.shape[:2]
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #步长 ch cw
    for row in range(0, h, ch):
        for col in range(0, w, cw):
            #获取分块(感兴趣区域)
            roi = gray[row:row+ch, col:cw+col]
            print(np.std(roi), np.mean(roi))
            dev = np.std(roi)
            if dev < 15:
                gray[row:row + ch, col:cw + col] = 255   #dev < 15的让它变白
            else:
                ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
                gray[row:row + ch, col:cw + col] = dst
    cv.imwrite("D:/vcprojects/result_binary.png", gray)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/red_text2.png")
#cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
#cv.imshow("input image", src)
big_image_binary(src)
cv.waitKey(0)

cv.destroyAllWindows()
big_image_binary(src)
cv.waitKey(0)

cv.destroyAllWindows()

原图:

在这里插入图片描述

全局阈值效果:

在这里插入图片描述

全局阈值过滤掉噪点效果:【上一张图全局阈值右边还有噪点 过滤后噪点消失】

在这里插入图片描述

高斯C方法局部阈值效果:
在这里插入图片描述

补充知识点:

#np.std()  标准差 
#np.mean() 均值
>>> a = np.array([[1, 2], [3, 4]])  
>>> np.std(a) # 计算矩阵全局标准差  
1.1180339887498949
>>> np.std(a) # 计算矩阵全局标准差
2.5
>>> np.std(a, axis=0) # axis=0计算每一列的标准差  
array([ 1., 1.]) 
>>> np.std(a, axis=1) # 计算每一行的标准差  array([ 0.5, 0.5])
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值