超大图像二值化代码:

#超大图像二值化----分块进行(方法:全局阈值VS局部阈值)
import cv2 as cv
import numpy as np
def bigImageBinary(image):
    print(image.shape)
    cw=256#步长
    ch=256
    h,w=image.shape[:2]
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    for row in range(0,h,ch):#从0开始,到h结束,以ch为步长
        for col in range(0,w,cw):
            roi=gray[row:row+ch,col:col+cw]#range of interest
            dst=cv.adaptiveThreshold(roi,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,127,20)
            #亦可采全局阈值方法:具体选择哪种应该根据图像的具体情况来选择-------dst阈值
            # cv.threshold(roi,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
            gray[row:row+ch,col:col+cw]=dst#???
            print(np.std(dst),np.mean(dst))#输出图像的均值、图像的方差,均值及方差的大小可以判断是否图像为空白进行滤值,可以减少阈值分割带来的误差
    cv.imwrite("E:\OpenCVTests/bigImage.jpg",gray)
src=cv.imread("E:\OpenCVTests\hugeimage.jpg")
#cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
#cv.imshow("input image",src)
bigImageBinary(src)

cv.waitKey(0)
cv.destroyAllWindows()

图像金字塔代码:

#图像金字塔
#高斯金字塔:reduce=2倍的高斯模糊+降采样(必须是一级一级来,不可越级);
#拉普拉斯金字塔:expand=扩大+卷积(升采样)
'''
图像金字塔方法的原理是:将参加融合的的每幅图像分解为多尺度的金字塔图像序列,将低分辨率的图像在上层,
高分辨率的图像在下层,上层图像的大小为前一层图像大小的1/4。层数为0,1,2……N。将所有图像的金字塔在
相应层上以一定的规则融合,就可得到合成金字塔,再将该合成金字塔按照金字塔生成的逆过程进行重构,得到融合金字塔。
'''
import cv2 as cv
import numpy as np
'''
拉普拉斯字塔:首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(5*5)对其进行卷积,
然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,将此图像作为输入,
重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构
'''
def pyramidDemo(image):#高斯金字塔
    level=3
    temp=image.copy()#复制一张
    pyramidImeages=[]
    for i in range(level):
        dst=cv.pyrDown(temp)#降     API,原理在上方
        pyramidImeages.append(dst)#加入列表
        cv.imshow("pyramidDown"+str(i),dst)
        temp=dst.copy()#为temp赋新值
    return pyramidImeages
def lapalianDemo(image):#拉普拉斯金字塔
    pyramidImeages=pyramidDemo(image)#调用上方的函数
    level=len(pyramidImeages)
    for i in range(level-1,-1,-1):#start  stop  step
        if(i-1)<0:
            expand=cv.pyrUp(pyramidImeages[i],dstsize=image.shape[:2])
            lpls=cv.subtract(image,expand)
            cv.imshow("lapalianDown"+str(i),lpls)
        else:
            expand = cv.pyrUp(pyramidImeages[i], pyramidImeages[i-1].shape[:2])#内插放大后图像
            lpls = cv.subtract(pyramidImeages[i-1], expand)#它的每一层L0图像是高斯金字塔本层G0图像与其高一层图像G1经内插放大后图像*G1的差
            cv.imshow("lapalianDown" + str(i), lpls)


#注意:图像的大小最好是2的n次方的倍数,否则结果会出问题,可以用resize调节大小
src=cv.imread("E:\opencv-4.0.1-vc14_vc15\opencv-4.1.0-vc14_vc15\opencv\sources\samples\data\lena.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
pyramidDemo(src)
lapalianDemo(src)

cv.waitKey(0)
cv.destroyAllWindows()

高斯金字塔展示:

二维梯度下降算法 梯度图像二值化_卷积


拉普拉斯金字塔展示:

二维梯度下降算法 梯度图像二值化_二维梯度下降算法_02

图像梯度代码:

#图像梯度-----当图像中存在边缘时,一定有较大的梯度值;而图像中较平滑的部分,灰度值变化较小,一般有较小的梯度。
#一阶导数(增减性)与Sobel算子,图像中相异处的边缘,像素差异较大,一阶导数的最高处
#二阶导数(凹凸性)最大变化处的值为0,即边缘是0值-----拉普拉斯算子
import cv2 as cv
import numpy as np
def sobelDemo(image):
    gradX=cv.Sobel(image,cv.CV_32F,1,0)#对X方向上求梯度,第三个参数为处理图像的深度-----Scharr算子为Sobel算子的增强版,
                                        # 将边缘更清晰的显示,可以提取图像微弱的边缘处
    gradY = cv.Sobel(image, cv.CV_32F, 0, 1)#对Y方向上求梯度
    grad_X=cv.convertScaleAbs(gradX)#求绝对值,转化到8位的图像上去
    grad_Y = cv.convertScaleAbs(gradY)
    cv.imshow("sobel_X",grad_X)
    cv.imshow("sobel_Y", grad_Y)
    gradxy=cv.addWeighted(grad_X,0.5,grad_Y,0.5,0)#整个图像的梯度
    cv.imshow("sobel", gradxy)
def lapalianDemo(image):#拉普拉斯梯度
    dst=cv.Laplacian(image,cv.CV_32F)
    lpls=cv.convertScaleAbs(dst)#求绝对值,转化到8位的图像上去
    cv.imshow("lapalianDemo",lpls)
src=cv.imread("E:\OpenCVTests\IMG_4686.JPG")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
#sobelDemo(src)
lapalianDemo(src)

cv.waitKey(0)
cv.destroyAllWindows()

X方向、Y方向上的梯度:

二维梯度下降算法 梯度图像二值化_卷积_03


整个图像的梯度

二维梯度下降算法 梯度图像二值化_卷积_04