简单的小程序,将莫尔条纹提取,测量两直线的像素点。
import cv2 as cv
from matplotlib import pyplot as py
from skimage import morphology
import numpy as np
from matplotlib import pyplot as plt
src=cv.imread('D:/pyziliao/tuxiangku/zhixianjuli.png')
cv.imshow('src1', src)
cv.waitKey(0)
cv.destroyAllWindows()
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray,127,255,cv.THRESH_BINARY)
cv.imshow('binary', binary)
cv.waitKey(0)
contours, hierarchy = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)#contours图像轮廓坐标,是一个链表
h,w = binary.shape
print(len(contours),hierarchy)
[vx,vy,x0,y0] = cv.fitLine(contours[0], cv.DIST_L2,0,0.01,0.01) # param 距离参数,0就好,自动选择最好的
print([vx,vy,x0,y0]) #拟合结果为一个四元素的容器, (vx, vy, x0, y0)。其中(vx, vy) 是直线的方向向量,(x0, y0) 是直线上的一个点。
k = vy / vx # #如果直线用 y=kx+b 来表示,那么 k = vy/vx,b = y0 - k * x0。
# reps ,aeps 用于表示拟合直线所需要的径向,角度 精度,通常 设置为0.01返回值是共线的归一化向量
b = int((-x0*k) + y0)
print(b)
print(k)
# 说白了就是一个方向和一个点,点斜式
y = int(((w-x0)*k)+y0)
print(y) # 计算两个点,代值计算就行
#cv.line(src,(int(x0),int(y0)),(0,b),(0,255,0),2)#画线函数
cv.line(src,(w,y),(0,b),(0,255,0),2)#画线函数
cv.imshow("result1",src)
cv.waitKey()
cv.destroyAllWindows()
[vx1,vy1,x01,y01] = cv.fitLine(contours[1], cv.DIST_L2,0,0.01,0.01) # param 距离参数,0就好,自动选择最好的
print([vx1,vy1,x01,y01]) #拟合结果为一个四元素的容器, (vx, vy, x0, y0)。其中(vx, vy) 是直线的方向向量,(x0, y0) 是直线上的一个点。
k1 = vy1 / vx1
# reps ,aeps 用于表示拟合直线所需要的径向,角度 精度,通常 设置为0.01返回值是共线的归一化向量,和线上一点
b1 = int((-x01*k1) + y01)
print(b1)
print(k1)
# 说白了就是一个方向和一个点,点斜式嘛,还啥vec4f,,讲究
y1 = int(((w-x01)*k1)+y01)
print(y1) # 计算两个点,代值计算就行
#cv.line(src,(int(x01),int(y01)),(0,b1),(0,0,255),2)#画线函数
cv.line(src,(w,y1),(0,b1),(0,0,255),2)#画线函数
cv.imshow("result2",src)
cv.waitKey()
cv.destroyAllWindows()
cv.circle(src, (int(x0),int(y0)), 1, (255,0,0),2)
cv.circle(src, (int(x01),int(y01)), 1, (255,0,0),2)
cv.imshow("point",src)
cv.waitKey()
dis=np.sqrt((x0-x01)**2+(y0-y01)**2)
print(dis)
print(x0,y0,x01,y01,h,w)