python opencv图片拼接源码

import cv2
import numpy as np
import time
import math

def image_handle(image,leftpoint,rightpoint):
    #灰度处理
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    #图片裁剪
    gray_cut = gray[leftpoint[1]:rightpoint[1], leftpoint[0]:rightpoint[0]]
    #提取采样区平均像素值
    gray_sample = gray_cut[gray_cut.shape[0]-20:gray_cut.shape[0], 0:gray_cut.shape[1]]
    sample_value = np.mean(gray_sample)
    #二值化
    if sample_value<15:
        thresholdvalue=0
    else:
        thresholdvalue = sample_value - 15
    ret, binary = cv2.threshold(gray_cut, thresholdvalue, 255, cv2.THRESH_BINARY)
    #添加白边
    img_300x300 = cv2.copyMakeBorder(binary, 30, 30, 30, 30,
                                     cv2.BORDER_CONSTANT,
                                     value=255)
    contours, heriachy = cv2.findContours(img_300x300, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    #边缘筛选
    mylist = []
    for i in range(len(contours)):
        if len(contours[i]) > 5:#点数太少
            listdy = []
            for j in range(len(contours[i])):#去掉横轴跨度太小的边缘(横轴跨度太小大概率不是玻璃边缘)
                listdy.append(contours[i][j][0][0])
            if (max(listdy) - min(listdy)) > (rightpoint[0] - leftpoint[0]):
                mylist.append(i)
    dx = []
    dy = []
    #坐标提取换算
    if len(mylist)==0:#未识别到边缘
        return 0,0
    else:
        for j in range(len(mylist)):
            a = contours[mylist[j]]
            for i in range(len(a)):
                b = a[i]
                c = b[0]
                if (c[0] > (rightpoint[0]-leftpoint[0]+26)):
                    dx.append(c[0])
                    dy.append(c[1])
        ndy = len(dy)
        if ndy==0:
            return 0,0
        else:
            di = 0
            for i in range(ndy):
                if dy[i - di] < (max(dy) - 3):
                    del dy[i - di]
                    del dx[i - di]
                    di = di + 1
            #坐标换算
            dxa = np.mean(dx)+leftpoint[0]-30
            dya = np.mean(dy)+leftpoint[1]-30
            return dxa,dya

def image_stitching(image_after,image2_before,d):#图像拼接函数
    # 获取图像尺寸
    image2_shape = image2_before.shape
    high = image2_shape[0]
    width = image2_shape[1]
    #图像平移
    image2_before1 = image2_before[0:high - d, 0:width]
    image2_before2 = cv2.copyMakeBorder(image2_before1, d, 0, 0, 0,
                                     cv2.BORDER_CONSTANT,
                                     value=0)
    #图像拼接
    img_stitching = np.where(image_after < image2_before2, image2_before2, image_after)
    return img_stitching

def image_DLOP(image0,image45,image90,image135,correction,lamda):#获取DOLP图像函数
    #灰度处理
    i0gray = cv2.cvtColor(image0, cv2.COLOR_BGR2GRAY)
    i45gray = cv2.cvtColor(image45, cv2.COLOR_BGR2GRAY)
    i90gray = cv2.cvtColor(image90, cv2.COLOR_BGR2GRAY)
    i135gray = cv2.cvtColor(image135, cv2.COLOR_BGR2GRAY)
    #高斯滤波
    i0u8 = cv2.GaussianBlur(i0gray, (3, 3), 2)
    i45u8 = cv2.GaussianBlur(i45gray, (3, 3), 2)
    i90u8 = cv2.GaussianBlur(i90gray, (3, 3), 2)
    i135u8 = cv2.GaussianBlur(i135gray, (3, 3), 2)
    #转换为float
    i0 = i0u8.astype(np.float16)
    i45 = i45u8.astype(np.float16)
    i90 = i90u8.astype(np.float16)
    i135 = i135u8.astype(np.float16)
    #求s0,s1,s2
    s0d = np.add(i0, i90)
    s0=np.where(s0d==0,1,s0d)
    s1 = np.divide(np.subtract(i0, i90), s0)
    s2 = np.divide(np.subtract(i45, i135), s0)
    #获取dolp矩阵
    DOLP = np.sqrt((np.square(s1) + np.square(s2)))
    #矩阵校正
    DOLPadjust0 = np.divide(DOLP, float(correction))
    #数据处理,大于1置1
    DOLPadjust1 = np.where(DOLPadjust0 >= 1, 1, DOLPadjust0)
    #按比例还原为灰度图
    DOLPgray = np.multiply(DOLPadjust1, 255)
    #四舍五入,为整数,并转换数据位uint8
    DOLPgray0 = np.round(DOLPgray)
    DOLPgray1 = DOLPgray0.astype(np.uint8)
    #伪RGB图转化
    DOLPRGB0 = cv2.applyColorMap(DOLPgray1, cv2.COLORMAP_JET)
    DOLPRGB1 = cv2.GaussianBlur(DOLPRGB0, (3, 3), 2)

    #双折射
    birefringence = np.divide(np.multiply(np.arcsin(DOLPadjust1), float(lamda)), 2 * math.pi)
    birefringencegray = np.multiply(np.divide(birefringence, 157.5), 255)
    birefringencegray0 = np.round(birefringencegray)
    birefringencegray1 = birefringencegray0.astype(np.uint8)
    birefringenceRGB0 = cv2.applyColorMap(birefringencegray1, cv2.COLORMAP_JET)
    birefringenceRGB1 = cv2.GaussianBlur(birefringenceRGB0, (3, 3), 2)

    return DOLPRGB1,birefringenceRGB1

if __name__ == "__main__":
    start = time.time()

    # src0 = cv2.imread('E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po1_I0.jpg')
    # src1 = cv2.imread('E:\DC BREAKER\python\Project\Auto-Detection\p1\P11P55o1_I90.jpg')
    im0 = cv2.imread('E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po1_I0.jpg')
    im45 = cv2.imread('E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po1_I45.jpg')
    im90 = cv2.imread('E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po1_I90.jpg')
    im135 = cv2.imread('E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po1_I135.jpg')
    imDOLP1, imbirefringence1 = image_DLOP(im0, im45, im90, im135, float(0.9),
                                                      float(630))
    im0 = cv2.imread('E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po3_I0.jpg')
    im45 = cv2.imread(
        'E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po3_I45.jpg')
    im90 = cv2.imread(
        'E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po3_I90.jpg')
    im135 = cv2.imread(
        'E:\DC BREAKER\python\Project\Auto-Detection\Auto-Detection\camera\picture_2022_02_23\po3_I135.jpg')
    imDOLP2, imbirefringence2 = image_DLOP(im0, im45, im90, im135, float(0.9),
                                           float(630))
    aaa=image_stitching(imDOLP1, imDOLP2, 163)
    cv2.namedWindow('dddddd', 0)
    cv2.imshow('dddddd', aaa)
    cv2.waitKey(0)

 

posted @ 2021-08-05 16:29  菜芽caiya  阅读(191)  评论(0编辑  收藏  举报