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

超大图像的二值化方法

(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])
复制代码
### Python OpenCV图像处理实战教程与示例代码 以下是几个典型的Python OpenCV图像处理案例及其对应的代码实现: #### 1. 加载并显示图像 这是最基础的操作之一,用于验证环境配置是否正常工作。 ```python import cv2 # 加载图像 image = cv2.imread('example.jpg') # 显示图像 cv2.imshow('Image', image) # 等待按键按下后关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows() ``` 此代码片段展示了如何加载一张名为`example.jpg`的图片,并将其显示在一个窗口中[^2]。 #### 2. 边缘检测 Canny边缘检测是一种广泛使用的算法,能够有效识别图像中的边界。 ```python import cv2 import numpy as np # 加载灰度图像 gray_image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # 应用Canny边缘检测 edges = cv2.Canny(gray_image, threshold1=100, threshold2=200) # 显示结果 cv2.imshow('Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码实现了从读取原始图像到执行Canny算子的过程,最终展示的是提取出来的边缘信息[^2]。 #### 3. 轮廓发现与绘制 轮廓分析对于形状匹配和物体计数非常有用。 ```python import cv2 import numpy as np # 加载二值化后的图像(假设已预处理) binary_image = cv2.imread('thresholded_example.png', cv2.IMREAD_GRAYSCALE) # 查找轮廓 contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 创建空白画布 canvas = np.zeros_like(binary_image) # 绘制所有轮廓 cv2.drawContours(canvas, contours, -1, (255), thickness=cv2.FILLED) # 展示结果 cv2.imshow('Contours', canvas) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这里介绍了如何利用`findContours()`函数获取对象边界的坐标集合,并通过`drawContours()`将这些区域可视化出来。 #### 4. 图像平滑滤波 高斯模糊可以减少噪声干扰,使后续计算更加精确。 ```python import cv2 # 加载彩色图像 color_image = cv2.imread('noisy_image.jpg') # 施加GaussianBlur过滤器 blurred_image = cv2.GaussianBlur(color_image, ksize=(7, 7), sigmaX=0) # 对比效果 cv2.imshow('Original Image', color_image) cv2.imshow('Blurred Image', blurred_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该脚本演示了怎样运用高斯核对输入数据实施卷积运算从而达到降噪目的[^1]。 以上就是一些常见的基于PythonOpenCV框架下的实际应用场景例子。更多资源可以从官方文档或者第三方书籍资料里获得进一步指导[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值