网站建设培训班上的讲话,外链的作用,中国最顶尖设计师,四个字广告公司名字文章目录1.BinomialBlurImageFilter计算每个维度上的最近邻居平均值2.高斯平滑3.图像的高阶导数 RecursiveGaussianImageFilter4.均值滤波5.中值滤波6.离散高斯平滑7.曲率驱动流去噪图像 CurvatureFlowImageFilter8.由参数alpha和beta控制的幂律自适应直方图均衡化9.Canny 边缘…
文章目录1.BinomialBlurImageFilter计算每个维度上的最近邻居平均值2.高斯平滑3.图像的高阶导数 RecursiveGaussianImageFilter4.均值滤波5.中值滤波6.离散高斯平滑7.曲率驱动流去噪图像 CurvatureFlowImageFilter8.由参数alpha和beta控制的幂律自适应直方图均衡化9.Canny 边缘检测10.Sobel边缘检测和基于过零的边缘检测保存图像和读取图像
import itk
import cv2
import matplotlib.pyplot as plt
import numpy as npdef saveImage(inImage,savePath):writer itk.ImageFileWriter[type(inImage)].New()writer.SetFileName(savePath)writer.SetInput(inImage)writer.Update()PixelType itk.UC
Dimension 2
ImageType itk.Image[PixelType, Dimension]
imagePath1 rD:\svnproject\drrimage.tif
reader1 itk.ImageFileReader[ImageType].New()
reader1.SetFileName(imagePath1)
reader1.Update()
image1 reader1.GetOutput()
1.BinomialBlurImageFilter计算每个维度上的最近邻居平均值
#BinomialBlurImageFilter计算每个维度上的最近邻居平均值。根据用户的指定该过程将重复多次。原则上经过大量的迭代结果将接近高斯卷积。
#https://examples.itk.org/src/filtering/smoothing/blurringanimageusingabinomialkernel/documentation
#number_of_repetitions整型值越大,图像越模糊
def SmoothingWithBinomialKernel(inputImage,number_of_repetitions):ImageType type(inputImage)binomialFilter itk.BinomialBlurImageFilter[ImageType,ImageType].New()binomialFilter.SetInput(inputImage)binomialFilter.SetRepetitions(number_of_repetitions)rescaler itk.RescaleIntensityImageFilter[ImageType, ImageType].New()rescaler.SetInput(binomialFilter.GetOutput())rescaler.SetOutputMinimum(0)rescaler.SetOutputMaximum(255)outputFileName outImage_str(number_of_repetitions).pngsaveImage(rescaler.GetOutput(),outputFileName)return rescaler.GetOutput()resImage1 SmoothingWithBinomialKernel(image1,1)
resImage2 SmoothingWithBinomialKernel(image1,10)
resImage3 SmoothingWithBinomialKernel(image1,20)
resImage4 SmoothingWithBinomialKernel(image1,50)
resImage5 SmoothingWithBinomialKernel(image1,100)
resImage6 SmoothingWithBinomialKernel(image1,150)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(repetitions1)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(repetitions10)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(repetitions20)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(repetitions50)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(repetitions100)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(repetitions150)
plt.show()
结果
2.高斯平滑
#通过高斯核卷积计算图像的平滑。 https://examples.itk.org/src/filtering/smoothing/computessmoothingwithgaussiankernel/documentation?highlightsmooth
# sigmaValue浮点型可以大于1.0值越大,图像越模糊
def SmoothingWithGaussianKernel(inputImage,sigmaValue):ImageType type(inputImage)smoothFilter itk.SmoothingRecursiveGaussianImageFilter[ImageType, ImageType].New()smoothFilter.SetInput(inputImage)smoothFilter.SetSigma(sigmaValue)outputFileName outImage_str(sigmaValue).pngsaveImage(smoothFilter.GetOutput(),outputFileName)return smoothFilter.GetOutput()#高斯平滑
resImage1 SmoothingWithGaussianKernel(image1,0.1)
resImage2 SmoothingWithGaussianKernel(image1,0.5)
resImage3 SmoothingWithGaussianKernel(image1,0.9)
resImage4 SmoothingWithGaussianKernel(image1,1.5)
resImage5 SmoothingWithGaussianKernel(image1,2.5)
resImage6 SmoothingWithGaussianKernel(image1,5.5)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(sigmaValue0.1)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(sigmaValue0.5)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(sigmaValue0.9)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(sigmaValue1.5)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(sigmaValue2.5)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(sigmaValue5.5)
plt.show()结果
3.图像的高阶导数 RecursiveGaussianImageFilter
#求图像的高阶导数。https://examples.itk.org/src/filtering/smoothing/findhigherderivativesofimage/documentation
#axisType--0表示x轴1表示y轴 (突出边界)
def SmoothingWithHigherDerivatives(inputImage,axisType):ImageType type(inputImage)gaussianFilter itk.RecursiveGaussianImageFilter[ImageType, ImageType].New()gaussianFilter.SetInput(inputImage)gaussianFilter.SetDirection(axisType) #x axisgaussianFilter.SetSecondOrder()outputFileName outImage_str(axisType).pngsaveImage(gaussianFilter.GetOutput(),outputFileName)return gaussianFilter.GetOutput()#求图像的高阶导数
resImage1 SmoothingWithHigherDerivatives(image1,0)
resImage2 SmoothingWithHigherDerivatives(image1,1)
plt.subplot(121),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(axisType X)
plt.subplot(122),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(axisType Y)
plt.show()结果
4.均值滤波
#对图像应用均值滤波。https://examples.itk.org/src/filtering/smoothing/meanfilteringofanimage/documentation
# radius整型值越大,图像越模糊
def SmoothingWithMeanFiltering(inputImage,radius):ImageType type(inputImage)meanFilter itk.MeanImageFilter[ImageType, ImageType].New()meanFilter.SetInput(inputImage)meanFilter.SetRadius(radius)outputFileName outImage_str(radius).pngsaveImage(meanFilter.GetOutput(),outputFileName)return meanFilter.GetOutput()#均值滤波
resImage1 SmoothingWithMeanFiltering(image1,1)
resImage2 SmoothingWithMeanFiltering(image1,5)
resImage3 SmoothingWithMeanFiltering(image1,10)
resImage4 SmoothingWithMeanFiltering(image1,20)
resImage5 SmoothingWithMeanFiltering(image1,40)
resImage6 SmoothingWithMeanFiltering(image1,80)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(radius1)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(radius5)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(radius10)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(radius20)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(radius40)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(radius80)
plt.show()结果
5.中值滤波
#在图像上应用中值滤波。https://examples.itk.org/src/filtering/smoothing/medianfilteringofanimage/documentation
#radius整型值越大,图像越模糊
def SmoothingWithMedianFiltering(inputImage,radius):ImageType type(inputImage)medianFilter itk.MedianImageFilter[ImageType, ImageType].New()medianFilter.SetInput(inputImage)medianFilter.SetRadius(radius)outputFileName outImage_str(radius).pngsaveImage(medianFilter.GetOutput(),outputFileName)return medianFilter.GetOutput()resImage1 SmoothingWithMedianFiltering(image1,1)
resImage2 SmoothingWithMedianFiltering(image1,5)
resImage3 SmoothingWithMedianFiltering(image1,10)
resImage4 SmoothingWithMedianFiltering(image1,20)
resImage5 SmoothingWithMedianFiltering(image1,40)
resImage6 SmoothingWithMedianFiltering(image1,80)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(radius1)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(radius5)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(radius10)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(radius20)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(radius40)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(radius80)
plt.show()结果
6.离散高斯平滑
#用离散高斯滤波器平滑图像。https://examples.itk.org/src/filtering/smoothing/smoothimagewithdiscretegaussianfilter/documentation
# variance浮点型可以大于1.0值越大,图像越模糊
def SmoothWithDiscreteGaussianfilter(inputImage,variance):ImageType type(inputImage)gaussianFilter itk.DiscreteGaussianImageFilter[ImageType, ImageType].New()gaussianFilter.SetInput(inputImage)gaussianFilter.SetVariance(variance) outputFileName outImage_str(variance).pngsaveImage(gaussianFilter.GetOutput(),outputFileName)return gaussianFilter.GetOutput()#离散高斯滤波器平滑图像
resImage1 SmoothWithDiscreteGaussianfilter(image1,1.0)
resImage2 SmoothWithDiscreteGaussianfilter(image1,4.0)
resImage3 SmoothWithDiscreteGaussianfilter(image1,8.0)
resImage4 SmoothWithDiscreteGaussianfilter(image1,15.0)
resImage5 SmoothWithDiscreteGaussianfilter(image1,30.0)
resImage6 SmoothWithDiscreteGaussianfilter(image1,50.0)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(variance1)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(variance4)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(variance8)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(variance15)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(variance30)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(variance50)
plt.show()结果
7.曲率驱动流去噪图像 CurvatureFlowImageFilter #使用曲率驱动流去噪图像。https://examples.itk.org/src/filtering/anisotropicsmoothing/computecurvatureflow/documentation?highlightdenois
#time_step越大迭代次数越多图像越暗
def DenoiseImageWithCurvatureDrivenFlow(inputImagePath,number_of_iterations,time_step):PixelType itk.FDimension 2ImageType itk.Image[PixelType, Dimension]reader itk.ImageFileReader[ImageType].New()reader.SetFileName(inputImagePath)reader.Update()ImageType type(reader.GetOutput())FilterType itk.CurvatureFlowImageFilter[ImageType, ImageType]curvatureFlowFilter FilterType.New()curvatureFlowFilter.SetInput(reader.GetOutput())curvatureFlowFilter.SetNumberOfIterations(number_of_iterations)curvatureFlowFilter.SetTimeStep(time_step)OutputImageType itk.Image[itk.UC,2]RescaleFilterType itk.RescaleIntensityImageFilter[ImageType, OutputImageType]rescaler RescaleFilterType.New()rescaler.SetInput(curvatureFlowFilter.GetOutput())outputPixelTypeMinimum itk.NumericTraits[itk.UC].min()outputPixelTypeMaximum itk.NumericTraits[itk.UC].max()rescaler.SetOutputMinimum(outputPixelTypeMinimum)rescaler.SetOutputMaximum(outputPixelTypeMaximum)outputFileName outImage_str(number_of_iterations)_str(time_step).pngsaveImage(rescaler.GetOutput(),outputFileName)return rescaler.GetOutput()#使用曲率驱动流去噪图像
resImage1 DenoiseImageWithCurvatureDrivenFlow(imagePath1,1,0.5)
resImage2 DenoiseImageWithCurvatureDrivenFlow(imagePath1,3,0.5)
resImage3 DenoiseImageWithCurvatureDrivenFlow(imagePath1,6,0.5)
resImage4 DenoiseImageWithCurvatureDrivenFlow(imagePath1,1,2.5)
resImage5 DenoiseImageWithCurvatureDrivenFlow(imagePath1,3,2.5)
resImage6 DenoiseImageWithCurvatureDrivenFlow(imagePath1,6,2.5)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(iterations1,time_step 0.5)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(iterations3,time_step 0.5)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(iterations6,time_step 0.5)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(iterations1,time_step 2.5)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(iterations3,time_step 2.5)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(iterations6,time_step 2.5)
plt.show()结果
8.由参数alpha和beta控制的幂律自适应直方图均衡化 # 应用由参数alpha和beta控制的幂律自适应直方图均衡化。
# https://examples.itk.org/src/filtering/imagestatistics/adaptivehistogramequalizationimagefilter/documentation?highlighthistogram
# 参数alpha控制了过滤器有多像经典直方图均衡化方法(alpha 0)到过滤器有多像非锐化蒙版(alpha 1)。
# 参数beta控制过滤器在多大程度上像非锐化蒙版(beta 0)和过滤器在多大程度上像穿透(beta 1其中alpha 1)。
# 参数窗口(或半径)控制计算局部统计信息的区域的大小。
# alpha:浮点型 beta:浮点型 radius整型
def ImageHistogramEqualization(inputImage,alpha,beta,radius):ImageType type(inputImage)histogramEqualization itk.AdaptiveHistogramEqualizationImageFilter[ImageType].New()histogramEqualization.SetInput(inputImage)histogramEqualization.SetAlpha(alpha)histogramEqualization.SetBeta(beta)radiusArr itk.Size[2]()radiusArr.Fill(radius)histogramEqualization.SetRadius(radiusArr)outputFileName outImage_str(alpha)_str(beta)_str(radius).pngitk.imwrite(histogramEqualization, outputFileName)return histogramEqualization.GetOutput()#自适应直方图均衡化
resImage1 ImageHistogramEqualization(image1,0.0,1.0,3)
resImage2 ImageHistogramEqualization(image1,1.0,0.0,3)
resImage3 ImageHistogramEqualization(image1,0.5,0.5,3)
resImage4 ImageHistogramEqualization(image1,0.0,1.0,7)
resImage5 ImageHistogramEqualization(image1,1.0,0.0,7)
resImage6 ImageHistogramEqualization(image1,0.5,0.5,7)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(alpha0.0,beta1.0,radius3)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(alpha1.0,beta0.0,radius3)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(alpha0.5,beta0.5,radius3)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(alpha0.0,beta1.0,radius7)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(alpha1.0,beta0.0,radius7)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(alpha0.5,beta0.5,radius7)
plt.show()结果
9.Canny 边缘检测 用之前的图像存在问题以后有时间找原因 #使用 Canny 边缘检测过滤器检测边缘
#https://examples.itk.org/src/filtering/imagefeature/detectedgeswithcannyedgedetectionfilter/documentation?highlightedge
def CannyEdgeDetectionImageFilter(inputImagePath,variance,lower_threshold,upper_threshold):InputPixelType itk.FOutputPixelType itk.UCDimension 2InputImageType itk.Image[InputPixelType, Dimension]OutputImageType itk.Image[OutputPixelType, Dimension]reader itk.ImageFileReader[InputImageType].New()reader.SetFileName(inputImagePath)cannyFilter itk.CannyEdgeDetectionImageFilter[InputImageType, InputImageType].New()cannyFilter.SetInput(reader.GetOutput())cannyFilter.SetVariance(variance)cannyFilter.SetLowerThreshold(lower_threshold)cannyFilter.SetUpperThreshold(upper_threshold)rescaler itk.RescaleIntensityImageFilter[InputImageType, OutputImageType].New()rescaler.SetInput(cannyFilter.GetOutput())rescaler.SetOutputMinimum(0)rescaler.SetOutputMaximum(255)outputFileName outImage_str(variance)_str(lower_threshold)_str(upper_threshold).pngsaveImage(rescaler.GetOutput(),outputFileName)return rescaler.GetOutput()#Canny 边缘检测
imagePath1 rD:\dell\picture\lena.png
resImage1 CannyEdgeDetectionImageFilter(imagePath1,0.1,0,255)
resImage2 CannyEdgeDetectionImageFilter(imagePath1,0.5,0,255)
resImage3 CannyEdgeDetectionImageFilter(imagePath1,1.0,0,255)
resImage4 CannyEdgeDetectionImageFilter(imagePath1,5.0,0,255)
resImage5 CannyEdgeDetectionImageFilter(imagePath1,10.0,0,255)
resImage6 CannyEdgeDetectionImageFilter(imagePath1,50.0,0,255)
plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(variance0.1)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(variance0.5)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(variance1.0)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(variance5.0)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(variance10)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(variance50)
plt.show()结果
10.Sobel边缘检测和基于过零的边缘检测 #将 SobelEdgeDetectionImageFilter 应用于图像
#https://examples.itk.org/src/filtering/imagefeature/sobeledgedetectionimagefilter/documentation?highlightedge
def SobelEdgeDetectionImageFilter(inputImagePath):input_image itk.imread(inputImagePath, pixel_typeitk.F)output_image itk.sobel_edge_detection_image_filter(input_image)rescaler itk.RescaleIntensityImageFilter[type(output_image), itk.Image[itk.UC, 2]].New()rescaler.SetInput(output_image)rescaler.SetOutputMinimum(0)rescaler.SetOutputMaximum(255)outputFileName outImage_obelEdgeDetection.pngsaveImage(rescaler.GetOutput(),outputFileName)return rescaler.GetOutput()#基于过零的边缘检测
#https://examples.itk.org/src/filtering/imagefeature/zerocrossingbasededgedecor/documentation?highlightedge
def ZerocrossingEdgeDetecor(inputImagePath,variance5.0):FloatImageType itk.Image[itk.F, 2]FilterType itk.ZeroCrossingBasedEdgeDetectionImageFilter[FloatImageType, FloatImageType]input_image itk.imread(inputImagePath, pixel_typeitk.F)edgeDetector FilterType.New()edgeDetector.SetInput(input_image)edgeDetector.SetVariance(variance)rescaler itk.RescaleIntensityImageFilter[type(edgeDetector.GetOutput()), itk.Image[itk.UC, 2]].New()rescaler.SetInput(edgeDetector.GetOutput())rescaler.SetOutputMinimum(0)rescaler.SetOutputMaximum(255)outputFileName outImage_ZerocrossingEdgeDetectionstr(variance).pngsaveImage(rescaler.GetOutput(),outputFileName)return rescaler.GetOutput()#Sobel边缘检测
resImage1 SobelEdgeDetectionImageFilter(imagePath1)# 基于过零的边缘检测
resImage2 ZerocrossingEdgeDetecor(imagePath1,0.1)
resImage3 ZerocrossingEdgeDetecor(imagePath1,0.5)
resImage4 ZerocrossingEdgeDetecor(imagePath1,1.0)
resImage5 ZerocrossingEdgeDetecor(imagePath1,5.0)
resImage6 ZerocrossingEdgeDetecor(imagePath1,20.0)plt.subplot(231),plt.imshow(itk.GetArrayFromImage(resImage1),gray),plt.title(Sobel)
plt.subplot(232),plt.imshow(itk.GetArrayFromImage(resImage2),gray),plt.title(variance0.1)
plt.subplot(233),plt.imshow(itk.GetArrayFromImage(resImage3),gray),plt.title(variance0.5)
plt.subplot(234),plt.imshow(itk.GetArrayFromImage(resImage4),gray),plt.title(variance1)
plt.subplot(235),plt.imshow(itk.GetArrayFromImage(resImage5),gray),plt.title(variance5)
plt.subplot(236),plt.imshow(itk.GetArrayFromImage(resImage6),gray),plt.title(variance20)
plt.show()
结果