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)