超大图像二值化

目录

超大图像的二值化方法

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

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

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)

print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/text.jpg")
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()
  • 全局阈值处理
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)

在这里插入图片描述
局部阈值的效果就比较好,因为局部阈值中有个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)

print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/tree.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()  返回数组元素的标准差
发布了7 篇原创文章 · 获赞 0 · 访问量 3147
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章