zoukankan      html  css  js  c++  java
  • Python+OpenCV图像处理之超大图像二值化

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

    python实现,包括全局阈值和局部阈值方法

    import cv2
    import numpy as np
    
    
    __author__ = "boboa"
    
    
    def big_image_demo(image):
        print(image.shape)
        # 分成小块,宽高
        cw = 256
        ch = 256
        h, w = image.shape[:2]
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        for row in range(0, h, ch):
            for col in range(0, w, cw):
                roi = gray[row:row + ch, col:col + cw]  # 获取分块
                # ret, dst = cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)   #全局阈值
                dst = cv2.adaptiveThreshold(roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 127, 20) # 局部阈值
                gray[row:row + ch, col:col + cw] = dst  # 分块覆盖
                print(np.std(dst), np.mean(dst))
        cv2.imwrite("image/result_bigimage.jpg", gray)
    
    
    
    if __name__ == "__main__":
        img = cv2.imread("image/big.jpg")
        cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("input image", img)
        big_image_demo(img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    原图

    全局阈值效果较差

     局部阈值效果较好

    (二)图像ROI与空白区域过滤

    python实现

    import cv2
    import numpy as np
    
    
    __author__ = "boboa"
    
    
    def big_image_demo(image):
        print(image.shape)
        # 分成小块,宽高
        cw = 256
        ch = 256
        h, w = image.shape[:2]
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        for row in range(0, h, ch):
            for col in range(0, w, cw):
                roi = gray[row:row + ch, col:col + cw]  # 分块区域
                # 获取图像的标准差和平均值  
                print(np.std(roi), np.mean(roi))
                dev = np.std(roi)  # 计算像素的标准差 
                if dev < 15:
                    # 如果像素的标准差小于某一阈值 我们就理解这个区域的图像变化不大,即黑白区间不明显,我们全部赋值为255
                    gray[row:row + ch, col:col + cw] = 255
                else:
                    ret, dst = cv2.threshold(roi, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
                    gray[row: row + ch, col: col + cw] = dst
        cv2.imwrite("image/result_bigimage.jpg", gray)
    
    if __name__ == "__main__":
        img = cv2.imread("image/big.jpg")
        cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("input image", img)
        big_image_demo(img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    运行结果,可以看出过滤之后,效果有所改善

  • 相关阅读:
    7.31 "简单"(大嘘)DP
    P2014 选课
    7.30 "简单"(大嘘)DP
    Codeforce 1131C Birthday (构造数组)
    洛谷 P1074【靶形数独】(DFS)
    NOIP2004【虫食算】(DFS)
    洛谷 P1025【数的划分】(DFS dp)
    洛谷P1019【单词接龙】(DFS)
    洛谷P1162【机器人搬重物】(BFS)
    洛谷P1141【01迷宫】
  • 原文地址:https://www.cnblogs.com/qianxia/p/11096304.html
Copyright © 2011-2022 走看看