# -*- coding: utf-8 -*-
"""
Created on Thu Apr 25 08:11:32 2019
@author: jiangshan
"""
import cv2
import numpy as np
dataSetDir = 'D:\\Workspace\\Spyder\\'
#filename = dataSetDir+'Mask_10228690_15.tif'
filename = dataSetDir+'Input_10228690_15.tiff'
# 加載彩圖
img = cv2.imread(filename)
# 灰度圖模式加載一副彩圖
#img = cv2.imread(filename,0)
# 0 - 1 二值化
#Grayimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#ret, thresh = cv2.threshold(Grayimg, 0, 1,cv2.THRESH_BINARY)
# 顯示圖像
#cv2.imshow('image',img)
#cv2.waitKey(0) #cv2.waitKey() 是鍵盤綁定函數。如果沒有鍵盤輸入,返回值為-1,如果這個參數為0,將會無限期的等待鍵盤輸入。
"""
cv2.destroyAllWindows() 刪除任何建立的窗口。如果想刪除特定的窗口可以使用cv2.destroyWindow(),在函數內輸入想刪除的窗口名。
"""
# 保存圖像
cv2.imwrite('Input-test.png',img)
#cv2.imwrite('Target.png',thresh)
image = cv2.imread('Input-test.png',cv2.COLOR_RGB2GRAY)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gaus = cv2.GaussianBlur(gray,(3,3),0)#高斯模糊預處理
edges = cv2.Canny(gaus, 50, 150, apertureSize=3)#Canny算子
minLineLength = 300
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1.0,np.pi/180,10,minLineLength,maxLineGap)#HoughLinesP直線特征提取
line = lines[:,0,:]#提取為二維
for x1, y1, x2, y2 in line:
cv2.line(image, (x1, y1), (x2, y2), (0,0,255), 2)#繪線
cv2.imshow('Detected houghline', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
#HoughCircles圓形特征提取
circles1 = cv2.HoughCircles(edges,cv2.HOUGH_GRADIENT,1,
100,param1=100,param2=30,minRadius=200,maxRadius=300)
circles = circles1[0,:,:]#提取為二維
circles = np.uint16(np.around(circles))#四舍五入,取整
for i in circles[:]:
cv2.circle(image,(i[0],i[1]),i[2],(255,0,0),5)#畫圓
cv2.circle(image,(i[0],i[1]),2,(255,0,255),10)#畫圓心
cv2.imshow('Detected houghCircles', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread('Input-test.png')
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#將圖像轉化為灰度圖像
cv2.imshow("Original",image)
cv2.waitKey()
#拉普拉斯邊緣檢測
lap = cv2.Laplacian(image,cv2.CV_64F)#拉普拉斯邊緣檢測
lap = np.uint8(np.absolute(lap))##對lap去絕對值
cv2.imshow("Laplacian",lap)
cv2.waitKey()
#Sobel邊緣檢測
sobelX = cv2.Sobel(image,cv2.CV_64F,1,0)#x方向的梯度
sobelY = cv2.Sobel(image,cv2.CV_64F,0,1)#y方向的梯度
sobelX = np.uint8(np.absolute(sobelX))#x方向梯度的絕對值
sobelY = np.uint8(np.absolute(sobelY))#y方向梯度的絕對值
sobelCombined = cv2.bitwise_or(sobelX,sobelY)#
cv2.imshow("Sobel X", sobelX)
cv2.waitKey()
cv2.imshow("Sobel Y", sobelY)
cv2.waitKey()
cv2.imshow("Sobel Combined", sobelCombined)
cv2.waitKey()
#Canny邊緣檢測
canny = cv2.Canny(image,30,150)
cv2.imshow("Canny",canny)
cv2.waitKey()
#Canny邊緣提取
import cv2 as cv
def edge_demo(image):
blurred = cv.GaussianBlur(image, (3, 3), 0)
gray = cv.cvtColor(blurred, cv.COLOR_RGB2GRAY)
# xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0) #x方向梯度
# ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1) #y方向梯度
# edge_output = cv.Canny(xgrad, ygrad, 50, 150)
edge_output = cv.Canny(gray, 50, 150)
cv.imshow("Canny Edge", edge_output)
dst = cv.bitwise_and(image, image, mask= edge_output)
cv.imshow("Color Edge", dst)
src = cv.imread('Input-test.png')
cv.namedWindow('input_image', cv.WINDOW_NORMAL) #設置為WINDOW_NORMAL可以任意縮放
cv.imshow('input_image', src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()