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)
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?