精华内容
下载资源
问答
  • python图像处理——频率域增强

    千次阅读 2019-02-16 10:32:13
    图像的傅里叶变换: import chardet import numpy as np import cv2 as cv import cv2 from PIL import Image import sys from matplotlib import pyplot as plt img = cv2.imread('D:/1/4...

    图像的傅里叶变换:

    		import chardet
    		import numpy as np
    		import cv2 as cv
    		import cv2
    		from PIL import Image
    		import sys
    		from matplotlib import pyplot as plt
    		
    		
    		
    		img = cv2.imread('D:/1/4.jpg',0)
    		f = np.fft.fft2(img)
    		fshift = np.fft.fftshift(f)
    		magnitude_spectrum = 20*np.log(np.abs(fshift))
    		
    		rows, cols = img.shape
    		crow,ccol = int(rows/2) , int(cols/2)
    		fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
    		f_ishift = np.fft.ifftshift(fshift)
    		img_back = np.fft.ifft2(f_ishift)
    		img_back = np.abs(img_back)
    		
    		plt.subplot(221),plt.imshow(img, cmap = 'gray')
    		plt.title('Input Image'), plt.xticks([]), plt.yticks([])
    		plt.subplot(222),plt.imshow(magnitude_spectrum, cmap = 'gray')
    		plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
    		plt.subplot(223),plt.imshow(img_back)   #恢复图像
    		plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
    		plt.subplot(224),plt.imshow(img_back, cmap = 'gray')
    		plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
    		plt.show()
    
    

    在这里插入图片描述

    图像的噪声处理与去噪:

    		def add_noise(img):
    		    rows,cols,dims=img.shape
    		    for i in range(5000):
    		        x=np.random.randint(0,rows)
    		        y=np.random.randint(0,cols)
    		        img[x,y,:]=1
    		
    		#二值化处理,以128位界
    		def add1_noise(img):
    		    rows,cols=img.shape
    		    for i in range(rows):
    		        for j in range(cols):
    		            if (img[i,j]<=128):
    		                img[i,j]=0
    		            else:
    		                img[i,j]=1
    		
    		# 高斯噪声
    		def GaussieNoisy(image,sigma):
    		    row,col,ch= image.shape
    		    mean = 0
    		    gauss = np.random.normal(mean,sigma,(row,col,ch))
    		    gauss = gauss.reshape(row,col,ch)
    		    noisy = image + gauss
    		    return noisy.astype(np.uint8)
    		
    		#椒盐噪声
    		def spNoisy(image,s_vs_p = 0.5,amount = 0.004):
    		    row,col,ch = image.shape
    		    out = np.copy(image)
    		    num_salt = np.ceil(amount * image.size * s_vs_p)
    		    coords = [np.random.randint(0, i - 1, int(num_salt))  for i in image.shape]
    		    out[coords] = 1
    		    num_pepper = np.ceil(amount* image.size * (1. - s_vs_p))
    		    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    		    out[coords] = 0
    		    return out
    		
    		img=np.array(Image.open('D:/1/1.jpg'))
    		plt.figure()
    		plt.subplot(221)
    		plt.title("src_img")
    		plt.imshow(img)
    		plt.axis('off')
    		
    		plt.subplot(222)
    		plt.title("noise_img")
    		add_noise(img)
    		plt.imshow(img)
    		plt.axis('off')
    		
    		# # 图像二值化,像素值大于128的变为1,否则变为0
    		img2=np.array(Image.open('D:/1/1.jpg').convert('L'))
    		plt.subplot(223)
    		plt.title("noise2_img")
    		add1_noise(img2)
    		plt.imshow(img2)
    		plt.axis('off')
    		
    		plt.subplot(224)
    		plt.title("GaussieNoisy")
    		img3=np.array(Image.open('D:/1/1.jpg'))
    		plt.imshow(GaussieNoisy(img3,25))
    		plt.axis('off')
    		plt.show()
    

    在这里插入图片描述

    傅里叶变换与逆变换:

    		# 傅里叶变换:
    		#       傅里叶变换将低频信号放在了边缘,高频信号放在了中间,然而一副图像,
    		#       很明显的低频信号多而明显,所以讲低频信号移至中心
    		
    		img = cv2.imread('D:/1/4.jpg',0)
    		f = np.fft.fft2(img)
    		fshift = np.fft.fftshift(f)#将频谱对称轴从左上角移至中心
    		# #对于负数可以求角度:
    		# # ph_f=np.angle(f)
    		# # ph_fshift = np.angle(fshift)
    		#取绝对值:将复数变化成实数
    		#取对数的目的为了将数据变化到较小的范围(比如0-255)
    		s1 = np.log(np.abs(f))
    		s2 = np.log(np.abs(fshift))
    		plt.subplot(221),plt.imshow(img,'gray'),plt.title('original')
    		plt.xticks([]), plt.yticks([])
    		plt.subplot(222),plt.imshow(s2,'gray'),plt.title('center')
    		plt.xticks([]), plt.yticks([])
    		f1shift = np.fft.ifftshift(fshift)# 逆变换
    		img_back = np.fft.ifft2(f1shift)
    		img_back = np.abs(img_back)#出来的是复数,无法显示,求绝对值
    		plt.subplot(223),plt.imshow(img_back,'gray'),plt.title('img back')
    		plt.xticks([]), plt.yticks([])
    		plt.show()
    

    在这里插入图片描述

    傅里叶变换进行滤波:

    傅里叶变换实现高通录滤波:
    图像在变换加移动中心后,从中间到外面,频率上依次是从低频到高频的,
    那么我们如果把中间规定一小部分去掉,是不是相对于把低频信号去掉了呢?
    这也就是相当于进行了高通滤波

    低通滤波器:把上述模板中的1变成0,0变成1

    			def lowPassFilter(image, d):
    		    f = np.fft.fft2(image)
    		    fshift = np.fft.fftshift(f)
    		    def make_transform_matrix(d):
    		        transfor_matrix = np.zeros(image.shape)
    		        center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
    		        for i in range(transfor_matrix.shape[0]):
    		            for j in range(transfor_matrix.shape[1]):
    		                def cal_distance(pa, pb):
    		                    from math import sqrt
    		                    dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
    		                    return dis
    		                dis = cal_distance(center_point, (i, j))
    		                if dis <= d:
    		                    transfor_matrix[i, j] = 1
    		                else:
    		                    transfor_matrix[i, j] = 0
    		        return transfor_matrix
    		
    		    d_matrix = make_transform_matrix(d)
    		    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
    		    return new_img
    		
    		def highPassFilter(image,d):
    		    f = np.fft.fft2(image)
    		    fshift = np.fft.fftshift(f)
    		    def make_transform_matrix(d):
    		        transfor_matrix = np.zeros(image.shape)
    		        center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
    		        for i in range(transfor_matrix.shape[0]):
    		            for j in range(transfor_matrix.shape[1]):
    		                def cal_distance(pa,pb):
    		                    from math import sqrt
    		                    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
    		                    return dis
    		                dis = cal_distance(center_point,(i,j))
    		                if dis <= d:
    		                    transfor_matrix[i,j]=0
    		                else:
    		                    transfor_matrix[i,j]=1
    		        return transfor_matrix
    		    d_matrix = make_transform_matrix(d)
    		    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
    		    return new_img
    		
    		img = cv2.imread('D:/1/5.jpg',0)
    		plt.figure()
    		plt.subplot(221)
    		plt.imshow(img,cmap="gray")
    		plt.axis("off")
    		plt.title('gray')
    		
    		
    		f = np.fft.fft2(img)
    		fshift = np.fft.fftshift(f)
    		s1 = np.log(np.abs(fshift))
    		plt.subplot(222)
    		plt.imshow(s1,'gray')
    		plt.axis("off")
    		plt.title('Frequency Domain')
    		
    		plt.subplot(223)
    		plt.imshow(lowPassFilter(img,100),cmap="gray")
    		plt.axis("off")
    		plt.title('lowPassFilter')
    		
    		
    		plt.subplot(224)
    		plt.imshow(highPassFilter(img,50),cmap="gray")
    		plt.axis("off")
    		plt.title('highPassFilter')
    		plt.show()
    			
    

    在这里插入图片描述

    图像噪声与去噪算法

    中值滤波
    概述: 中值滤波是一种非线性空间滤波器, 它的响应基于图像滤波器包围的图像区域中像素的统计排序,
    然后由统计排序结果的值代替中心像素的值.中值滤波器将其像素邻域内的灰度中值代替代替该像素的值. 中值滤波器的使用非常普遍,
    这是因为对于一定类型的随机噪声, 它提供了一种优秀的去噪能力,比小尺寸的均值滤波器模糊程度明显要低. 中值滤波器对处理脉冲噪声(也称椒盐噪声)非常有效,
    因为该噪声是以黑白点叠加在图像上面的.

    均值滤波
    概述: 均值滤波器的输出是包含在滤波掩模领域内像素的简单平均值.
    均值滤波器最常用的目的就是减噪. 然而, 图像边缘也是由图像灰度尖锐变化带来的特性,
    所以均值滤波还是存在不希望的边缘模糊负面效应.

    		# 图片修复程序1(实现水印去除):修复白色区域
    		img = cv2.imread("D:/1/2.jpg")
    		hight, width, depth = img.shape[0:3]
    		# 图片二值化处理,把[240, 240, 240]~[255, 255, 255]以外的颜色变成0
    		thresh = cv2.inRange(img, np.array([240, 240, 240]), np.array([255, 255, 255]))
    		# 创建形状和尺寸的结构元素
    		kernel = np.ones((3, 3), np.uint8)
    		# 扩张待修复区域
    		hi_mask = cv2.dilate(thresh, kernel, iterations=1)
    		specular = cv2.inpaint(img, hi_mask, 5, flags=cv2.INPAINT_TELEA)
    		cv2.namedWindow("Image", 0)
    		cv2.resizeWindow("Image", int(width / 2), int(hight / 2))
    		cv2.imshow("Image", img)
    		cv2.namedWindow("newImage", 0)
    		cv2.resizeWindow("newImage", int(width / 2), int(hight / 2))
    		cv2.imshow("newImage", specular)
    		cv2.waitKey(0)
    		cv2.destroyAllWindows()
    

    在这里插入图片描述

    频域高斯滤波:

    		def GaussianHighFilter(image,d):
    		    f = np.fft.fft2(image)
    		    fshift = np.fft.fftshift(f)
    		    def make_transform_matrix(d):
    		        transfor_matrix = np.zeros(image.shape)
    		        center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
    		        for i in range(transfor_matrix.shape[0]):
    		            for j in range(transfor_matrix.shape[1]):
    		                def cal_distance(pa,pb):
    		                    from math import sqrt
    		                    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
    		                    return dis
    		                dis = cal_distance(center_point,(i,j))
    		                transfor_matrix[i,j] = 1-np.exp(-(dis**2)/(2*(d**2)))
    		        return transfor_matrix
    		    d_matrix = make_transform_matrix(d)
    		    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
    		    return new_img
    		
    		def GaussianLowFilter(image,d):
    		    f = np.fft.fft2(image)
    		    fshift = np.fft.fftshift(f)
    		    def make_transform_matrix(d):
    		        transfor_matrix = np.zeros(image.shape)
    		        center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
    		        for i in range(transfor_matrix.shape[0]):
    		            for j in range(transfor_matrix.shape[1]):
    		                def cal_distance(pa,pb):
    		                    from math import sqrt
    		                    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
    		                    return dis
    		                dis = cal_distance(center_point,(i,j))
    		                transfor_matrix[i,j] = np.exp(-(dis**2)/(2*(d**2)))
    		        return transfor_matrix
    		    d_matrix = make_transform_matrix(d)
    		    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
    		    return new_img
    		
    		
    		img = cv2.imread('D:/1/5.jpg',0)
    		f = np.fft.fft2(img)
    		fshift = np.fft.fftshift(f)
    		s1 = np.log(np.abs(fshift))
    		
    		plt.figure()
    		plt.subplot(221)
    		plt.imshow(img,cmap="gray")
    		plt.axis("off")
    		plt.title('gray')
    		
    		plt.subplot(222)
    		plt.axis("off")
    		plt.imshow(GaussianHighFilter(img,10),cmap="gray")
    		plt.title('GaussianHighFilter')
    		
    		
    		plt.subplot(223)
    		plt.axis("off")
    		plt.imshow(GaussianLowFilter(img,50),cmap="gray")
    		plt.title('GaussianLowFilter')
    		
    		plt.show()
    

    在这里插入图片描述

    空间域的高斯滤波

    		def GaussianOperator(roi):
    		    GaussianKernel = np.array([[1,2,1],[2,4,2],[1,2,1]])
    		    result = np.sum(roi*GaussianKernel/16)
    		    return result
    		
    		def GaussianSmooth(image):
    		    new_image = np.zeros(image.shape)
    		    image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
    		    for i in range(1,image.shape[0]-1):
    		        for j in range(1,image.shape[1]-1):
    		            new_image[i-1,j-1] =GaussianOperator(image[i-1:i+2,j-1:j+2])
    		    return new_image.astype(np.uint8)
    		
    		img=cv.imread("D:/1/5.jpg",0)
    		new_apple = GaussianSmooth(img)
    		plt.subplot(121)
    		plt.axis("off")
    		plt.title("origin image")
    		plt.imshow(img,cmap="gray")
    		plt.subplot(122)
    		plt.axis("off")
    		plt.title("Gaussian image")
    		plt.imshow(img,cmap="gray")
    		plt.subplot(122)
    		plt.axis("off")
    		plt.show()
    
    

    在这里插入图片描述

    相关函数说明:

    img[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行
    img[:,i] = 100 # 将第 i 列的所有数值设为 100
    img[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和
    img[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
    img[i].mean() # 第 i 行所有数值的平均值
    img[:,-1] # 最后一列

    展开全文
  • 文章目录图像频率域增强频率域低通滤波器H(u,v)理想低通滤波器Butterworth低通滤波器指数低通滤波器梯形低通滤波器 图像频率域增强 频率域低通滤波器H(u,v) 理想低通滤波器 由于高频成分包含有大量的边缘信息,...

    图像频率域增强

    在这里插入图片描述

    频率域低通滤波器H(u,v)

    理想低通滤波器

    在这里插入图片描述
    由于高频成分包含有大量的边缘信息,所以采用该滤波器在去噪音的同时会导致边缘信息损失使图像变模糊。

    Butterworth低通滤波器

    在这里插入图片描述

    指数低通滤波器

    在这里插入图片描述

    梯形低通滤波器

    在这里插入图片描述

    展开全文
  • 图像的傅里叶变换:import chardetimport numpy as npimport cv2 as cvimport cv2from PIL import Imageimport sysfrom matplotlib import pyplot as pltimg = cv2.imread('D:/1/4.jpg',0)f = np.fft.fft2(img)...

    图像的傅里叶变换:

    import chardet

    import numpy as np

    import cv2 as cv

    import cv2

    from PIL import Image

    import sys

    from matplotlib import pyplot as plt

    img = cv2.imread('D:/1/4.jpg',0)

    f = np.fft.fft2(img)

    fshift = np.fft.fftshift(f)

    magnitude_spectrum = 20*np.log(np.abs(fshift))

    rows, cols = img.shape

    crow,ccol = int(rows/2) , int(cols/2)

    fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

    f_ishift = np.fft.ifftshift(fshift)

    img_back = np.fft.ifft2(f_ishift)

    img_back = np.abs(img_back)

    plt.subplot(221),plt.imshow(img, cmap = 'gray')

    plt.title('Input Image'), plt.xticks([]), plt.yticks([])

    plt.subplot(222),plt.imshow(magnitude_spectrum, cmap = 'gray')

    plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])

    plt.subplot(223),plt.imshow(img_back) #恢复图像

    plt.title('Result in JET'), plt.xticks([]), plt.yticks([])

    plt.subplot(224),plt.imshow(img_back, cmap = 'gray')

    plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])

    plt.show()

    图像的噪声处理与去噪:

    def add_noise(img):

    rows,cols,dims=img.shape

    for i in range(5000):

    x=np.random.randint(0,rows)

    y=np.random.randint(0,cols)

    img[x,y,:]=1

    #二值化处理,以128位界

    def add1_noise(img):

    rows,cols=img.shape

    for i in range(rows):

    for j in range(cols):

    if (img[i,j]<=128):

    img[i,j]=0

    else:

    img[i,j]=1

    # 高斯噪声

    def GaussieNoisy(image,sigma):

    row,col,ch= image.shape

    mean = 0

    gauss = np.random.normal(mean,sigma,(row,col,ch))

    gauss = gauss.reshape(row,col,ch)

    noisy = image + gauss

    return noisy.astype(np.uint8)

    #椒盐噪声

    def spNoisy(image,s_vs_p = 0.5,amount = 0.004):

    row,col,ch = image.shape

    out = np.copy(image)

    num_salt = np.ceil(amount * image.size * s_vs_p)

    coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]

    out[coords] = 1

    num_pepper = np.ceil(amount* image.size * (1. - s_vs_p))

    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]

    out[coords] = 0

    return out

    img=np.array(Image.open('D:/1/1.jpg'))

    plt.figure()

    plt.subplot(221)

    plt.title("src_img")

    plt.imshow(img)

    plt.axis('off')

    plt.subplot(222)

    plt.title("noise_img")

    add_noise(img)

    plt.imshow(img)

    plt.axis('off')

    # # 图像二值化,像素值大于128的变为1,否则变为0

    img2=np.array(Image.open('D:/1/1.jpg').convert('L'))

    plt.subplot(223)

    plt.title("noise2_img")

    add1_noise(img2)

    plt.imshow(img2)

    plt.axis('off')

    plt.subplot(224)

    plt.title("GaussieNoisy")

    img3=np.array(Image.open('D:/1/1.jpg'))

    plt.imshow(GaussieNoisy(img3,25))

    plt.axis('off')

    plt.show()

    傅里叶变换与逆变换:

    # 傅里叶变换:

    # 傅里叶变换将低频信号放在了边缘,高频信号放在了中间,然而一副图像,

    # 很明显的低频信号多而明显,所以讲低频信号移至中心

    img = cv2.imread('D:/1/4.jpg',0)

    f = np.fft.fft2(img)

    fshift = np.fft.fftshift(f)#将频谱对称轴从左上角移至中心

    # #对于负数可以求角度:

    # # ph_f=np.angle(f)

    # # ph_fshift = np.angle(fshift)

    #取绝对值:将复数变化成实数

    #取对数的目的为了将数据变化到较小的范围(比如0-255)

    s1 = np.log(np.abs(f))

    s2 = np.log(np.abs(fshift))

    plt.subplot(221),plt.imshow(img,'gray'),plt.title('original')

    plt.xticks([]), plt.yticks([])

    plt.subplot(222),plt.imshow(s2,'gray'),plt.title('center')

    plt.xticks([]), plt.yticks([])

    f1shift = np.fft.ifftshift(fshift)# 逆变换

    img_back = np.fft.ifft2(f1shift)

    img_back = np.abs(img_back)#出来的是复数,无法显示,求绝对值

    plt.subplot(223),plt.imshow(img_back,'gray'),plt.title('img back')

    plt.xticks([]), plt.yticks([])

    plt.show()

    傅里叶变换进行滤波:

    傅里叶变换实现高通录滤波:

    图像在变换加移动中心后,从中间到外面,频率上依次是从低频到高频的,

    那么我们如果把中间规定一小部分去掉,是不是相对于把低频信号去掉了呢?

    这也就是相当于进行了高通滤波

    低通滤波器:把上述模板中的1变成0,0变成1

    def lowPassFilter(image, d):

    f = np.fft.fft2(image)

    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):

    transfor_matrix = np.zeros(image.shape)

    center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))

    for i in range(transfor_matrix.shape[0]):

    for j in range(transfor_matrix.shape[1]):

    def cal_distance(pa, pb):

    from math import sqrt

    dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)

    return dis

    dis = cal_distance(center_point, (i, j))

    if dis <= d:

    transfor_matrix[i, j] = 1

    else:

    transfor_matrix[i, j] = 0

    return transfor_matrix

    d_matrix = make_transform_matrix(d)

    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))

    return new_img

    def highPassFilter(image,d):

    f = np.fft.fft2(image)

    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):

    transfor_matrix = np.zeros(image.shape)

    center_point = tuple(map(lambda x:(x-1)/2,s1.shape))

    for i in range(transfor_matrix.shape[0]):

    for j in range(transfor_matrix.shape[1]):

    def cal_distance(pa,pb):

    from math import sqrt

    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)

    return dis

    dis = cal_distance(center_point,(i,j))

    if dis <= d:

    transfor_matrix[i,j]=0

    else:

    transfor_matrix[i,j]=1

    return transfor_matrix

    d_matrix = make_transform_matrix(d)

    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))

    return new_img

    img = cv2.imread('D:/1/5.jpg',0)

    plt.figure()

    plt.subplot(221)

    plt.imshow(img,cmap="gray")

    plt.axis("off")

    plt.title('gray')

    f = np.fft.fft2(img)

    fshift = np.fft.fftshift(f)

    s1 = np.log(np.abs(fshift))

    plt.subplot(222)

    plt.imshow(s1,'gray')

    plt.axis("off")

    plt.title('Frequency Domain')

    plt.subplot(223)

    plt.imshow(lowPassFilter(img,100),cmap="gray")

    plt.axis("off")

    plt.title('lowPassFilter')

    plt.subplot(224)

    plt.imshow(highPassFilter(img,50),cmap="gray")

    plt.axis("off")

    plt.title('highPassFilter')

    plt.show()

    图像噪声与去噪算法

    中值滤波

    概述: 中值滤波是一种非线性空间滤波器, 它的响应基于图像滤波器包围的图像区域中像素的统计排序,

    然后由统计排序结果的值代替中心像素的值.中值滤波器将其像素邻域内的灰度中值代替代替该像素的值. 中值滤波器的使用非常普遍,

    这是因为对于一定类型的随机噪声, 它提供了一种优秀的去噪能力,比小尺寸的均值滤波器模糊程度明显要低. 中值滤波器对处理脉冲噪声(也称椒盐噪声)非常有效,

    因为该噪声是以黑白点叠加在图像上面的.

    均值滤波

    概述: 均值滤波器的输出是包含在滤波掩模领域内像素的简单平均值.

    均值滤波器最常用的目的就是减噪. 然而, 图像边缘也是由图像灰度尖锐变化带来的特性,

    所以均值滤波还是存在不希望的边缘模糊负面效应.

    # 图片修复程序1(实现水印去除):修复白色区域

    img = cv2.imread("D:/1/2.jpg")

    hight, width, depth = img.shape[0:3]

    # 图片二值化处理,把[240, 240, 240]~[255, 255, 255]以外的颜色变成0

    thresh = cv2.inRange(img, np.array([240, 240, 240]), np.array([255, 255, 255]))

    # 创建形状和尺寸的结构元素

    kernel = np.ones((3, 3), np.uint8)

    # 扩张待修复区域

    hi_mask = cv2.dilate(thresh, kernel, iterations=1)

    specular = cv2.inpaint(img, hi_mask, 5, flags=cv2.INPAINT_TELEA)

    cv2.namedWindow("Image", 0)

    cv2.resizeWindow("Image", int(width / 2), int(hight / 2))

    cv2.imshow("Image", img)

    cv2.namedWindow("newImage", 0)

    cv2.resizeWindow("newImage", int(width / 2), int(hight / 2))

    cv2.imshow("newImage", specular)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    频域高斯滤波:

    def GaussianHighFilter(image,d):

    f = np.fft.fft2(image)

    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):

    transfor_matrix = np.zeros(image.shape)

    center_point = tuple(map(lambda x:(x-1)/2,s1.shape))

    for i in range(transfor_matrix.shape[0]):

    for j in range(transfor_matrix.shape[1]):

    def cal_distance(pa,pb):

    from math import sqrt

    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)

    return dis

    dis = cal_distance(center_point,(i,j))

    transfor_matrix[i,j] = 1-np.exp(-(dis**2)/(2*(d**2)))

    return transfor_matrix

    d_matrix = make_transform_matrix(d)

    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))

    return new_img

    def GaussianLowFilter(image,d):

    f = np.fft.fft2(image)

    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):

    transfor_matrix = np.zeros(image.shape)

    center_point = tuple(map(lambda x:(x-1)/2,s1.shape))

    for i in range(transfor_matrix.shape[0]):

    for j in range(transfor_matrix.shape[1]):

    def cal_distance(pa,pb):

    from math import sqrt

    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)

    return dis

    dis = cal_distance(center_point,(i,j))

    transfor_matrix[i,j] = np.exp(-(dis**2)/(2*(d**2)))

    return transfor_matrix

    d_matrix = make_transform_matrix(d)

    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))

    return new_img

    img = cv2.imread('D:/1/5.jpg',0)

    f = np.fft.fft2(img)

    fshift = np.fft.fftshift(f)

    s1 = np.log(np.abs(fshift))

    plt.figure()

    plt.subplot(221)

    plt.imshow(img,cmap="gray")

    plt.axis("off")

    plt.title('gray')

    plt.subplot(222)

    plt.axis("off")

    plt.imshow(GaussianHighFilter(img,10),cmap="gray")

    plt.title('GaussianHighFilter')

    plt.subplot(223)

    plt.axis("off")

    plt.imshow(GaussianLowFilter(img,50),cmap="gray")

    plt.title('GaussianLowFilter')

    plt.show()

    空间域的高斯滤波

    def GaussianOperator(roi):

    GaussianKernel = np.array([[1,2,1],[2,4,2],[1,2,1]])

    result = np.sum(roi*GaussianKernel/16)

    return result

    def GaussianSmooth(image):

    new_image = np.zeros(image.shape)

    image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)

    for i in range(1,image.shape[0]-1):

    for j in range(1,image.shape[1]-1):

    new_image[i-1,j-1] =GaussianOperator(image[i-1:i+2,j-1:j+2])

    return new_image.astype(np.uint8)

    img=cv.imread("D:/1/5.jpg",0)

    new_apple = GaussianSmooth(img)

    plt.subplot(121)

    plt.axis("off")

    plt.title("origin image")

    plt.imshow(img,cmap="gray")

    plt.subplot(122)

    plt.axis("off")

    plt.title("Gaussian image")

    plt.imshow(img,cmap="gray")

    plt.subplot(122)

    plt.axis("off")

    plt.show()

    相关函数说明:

    img[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行

    img[:,i] = 100 # 将第 i 列的所有数值设为 100

    img[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和

    img[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)

    img[i].mean() # 第 i 行所有数值的平均值

    img[:,-1] # 最后一列

    原文链接:https://blog.csdn.net/linkingfei/article/details/87433352

    展开全文
  • 频率域图像增强:以修改图像的傅里叶变换为基础的方法; 高、低通滤波,同态滤波。 另外还有彩色图像增强。 1.空间域图像增强 1.1基于灰度变换的图像增强 属于点处理技术,这部分内容参考之前的笔记点运算部分...

    图像增强Image Enhancement:采用某种技术手段,改善图像的视觉效果,获奖图像转换成更适合人眼观察和机器分析、识别的形式,以便从图像中获取更有用的信息。1

    • 空间域图像增强:针对图像自身,以对图像的像素直接处理为基础的方法;
      点处理,模板处理;
    • 频率域图像增强:以修改图像的傅里叶变换为基础的方法;
      高、低通滤波,同态滤波。

    另外还有彩色图像的增强。

    1.空间域图像增强

    1.1基于灰度变换的图像增强

    属于点处理技术,这部分内容参考之前的笔记点运算部分内容 ,有线性变换、幂次变换等。

    1.2基于直方图处理的图像增强

    灰度级直方图统计了不同灰度级出现的概率。

    I=imread('marketspace.jpg');
    I=rgb2gray(I);
    % I=double(uint8(I));
    for i=1:256
        h(i)=sum(sum(I==i-1));
    end
    subplot(1,2,1);imshow(I);
    subplot(1,2,2);plot(h);
    

    在这里插入图片描述
    直方图均衡化

    直方图均衡化处理,使得图像的灰度分布趋向均匀,图像所占有的像素灰度间距拉开,进而加大图像反差,达到增强目的。适用于一些由于灰度分布集中在较窄区间内的图像。

    I=imread('marketspace.jpg');
    I=rgb2gray(I);
    K=32;
    H=histeq(I,K);
    figure;
    subplot(2,2,1);imshow(I);
    subplot(2,2,2);imshow(H);hold on;
    subplot(2,2,3),hist(double(I),16),
    subplot(2,2,4),hist(double(H),16),
    

    结果:
    在这里插入图片描述
    分析:
    变换后直方图趋于平缓,灰级减少,灰度合并;原图像含像素多的几个灰级间隔被拉大,压缩的只是像素少的几个灰度级,实际视觉能接收的信息量增强了。可以看到增强的效果还是不错的,图中云层部分的细节有所增强。

    1.3空间域滤波增强

    属于模板处理技术,对图像进行滤波以去除图像噪声或增强图像细节。

    空间域平滑滤波器

    图像平滑(去噪):抑制噪声、改善图像质量,通过积分使图像边缘模糊。

    I=rgb2gray(imread('11.png'));
    figure;
    subplot(1,5,1),imshow(I),title("原始图像");
    N=imnoise(I, 'salt & pepper', 0.06);
    subplot(1,5,2),imshow(N),title("加椒盐噪声后的图像");
    % 1)均值滤波
    S=imfilter(N,fspecial('average', 5));
    subplot(1,5,3),imshow(S),title("5*5领域平滑");
    % 2)超限像素平滑法
    T=20;
    [m,n]=size(I);
    C=zeros(m,n);
    for i=1:m
        for j=1:n
            if abs(I(i, j)-S(i,j))>T
                C(i,j)=S(i,j);                      % if |I(x,y)-S(x,y)|>T then G(x,y)=S(x,y)
            else
                C(i,j)=I(i,j);                       % if |I(x,y)-S(x,y)|<=T then G(x,y)=I(x,y)
            end
        end
    end
    subplot(1,5,4),imshow(uint8(C));title("超限像素平滑法");
    % 3)高斯平滑线性滤波法
    G=imfilter(N, fspecial('gaussian', [3 3], 0.9), 'replicate');
    subplot(1,5,5),imshow(G),title("高斯平滑滤波");
    

    结果:
    在这里插入图片描述
    分析:
    (1)超限像素平滑是对局部平滑法的一种改进,对抑制椒盐噪声比较有效,对保护仅有微小灰度差的细节及纹理也有效。
    随着邻域增大,去噪能力增强,但模糊程度也增大。
    (2)高斯滤波器,对于高斯噪声的去噪效果较好。

    空间域锐化滤波器

    图像锐化:增强图像的边缘和轮廓,通过微分使图像边缘清晰。

    I=rgb2gray(imread('11.png'));
    figure;
    subplot(1,5,1),imshow(I),title("原始图像");
    N=imnoise(I, 'salt & pepper', 0.02);
    subplot(1,5,2),imshow(N),title("加椒盐噪声后的图像");
    S=imfilter(N, fspecial('sobel'));
    subplot(1,5,3), imshow(S),title("Sobel滤波");
    L=imfilter(N, fspecial('laplacian', 0.2));
    subplot(1,5,4),imshow(L),title("拉普拉斯滤波");
    G=imfilter(N, fspecial('log', [5 5], 0.5));
    subplot(1,5,5),imshow(G),title("高斯-拉普拉斯滤波");
    

    结果:
    在这里插入图片描述

    2.频率域图像增强

    频率域处理工作主要是:

     g(x,y)=f(x,y)h(x,y) \ g(x,y)=f(x,y)*h(x,y)\,

    2.1频率域平滑滤波器

    I=rgb2gray(imread('11.png'));
    figure;
    subplot(2,2,1),imshow(I),title("原始图像");
    N=imnoise(I, 'salt & pepper', 0.02);
    subplot(2,2,2),imshow(N),title("加椒盐噪声后的图像");
    NF=fftshift(fft2(N));
    [m,n]=size(N);
    H=zeros(m,n);
    % 1)理想低通滤波
    T=105;
    for i=1:m
        for j=1:n
            if sqrt((i-m/2)^2+(j-n/2)^2)<T
                H(i,j)=1;
            end
        end
    end
    L=NF.*H;
    L=ifft2(ifftshift(L));
    subplot(2,2,3),imshow(uint8(real(L))),title("理想低通滤波");
    % 2)巴特沃斯低通滤波器
    T=105;
    N=2;
    for i=1:m
        for j=1:n
            d=sqrt((i-m/2)^2+(j-n/2)^2);
            h=1/(1+(d/T)^(2*N));
            H(i,j)=h*NF(i,j);
        end
    end
    B=ifft2(ifftshift(H));
    subplot(2,2,4),imshow(uint8(real(B))),title("巴特沃斯滤波");
    

    结果(为了显示两种滤波器的效果区别,对图像进行了局部放大):
    在这里插入图片描述
    局部放大后看到对比效果

    分析:
    (1)理想低通滤波器会产生振铃现象使图像变得模糊,相对而言,巴特沃斯滤波器没有陡峭的变化,图像边缘的模糊程度减小。
    (2)阈值T越大,图像的模糊程度越低。

    2.2频率域锐化滤波器

    程序和上一个程序类似,只是公式稍有调整。

    % 1)理想高通滤波
    T=35;
    for i=1:m
        for j=1:n
            if sqrt((i-m/2)^2+(j-n/2)^2)>T
                H(i,j)=1;
            end
        end
    end
    L=NF.*H;
    L=ifft2(ifftshift(L));
    subplot(2,2,3),imshow(uint8(real(L))),title("理想低通滤波");
    % 2)巴特沃斯高通滤波器
    T=35;
    N=2;
    for i=1:m
        for j=1:n
            d=sqrt((i-m/2)^2+(j-n/2)^2);
            h=1/(1+(T/d)^(2*N));
            H(i,j)=h*NF(i,j);
        end
    end
    B=ifft2(ifftshift(H));
    subplot(2,2,4),imshow(uint8(real(B))),title("巴特沃斯滤波");
    

    结果:
    在这里插入图片描述
    分析:
    (1)巴特沃斯高通滤波器的效果较于理想高通滤波器好一点;
    (2)阈值T的值越小,锐化程度越高。

    2.3同态滤波器

    同态滤波把频率滤波和灰度变换结合:

    • 首先对非线性混杂信号做对数运算,把两个相乘的分量变为两个相加的分量,它们分别代表图像的高频和低频分量;
    • 然后用线性滤波方法处理;
    • 最后做逆运算,恢复处理后图像。

    可以应用于消除光照不足带来的影响,同时又不损失图像细节。

    I0=rgb2gray(imread('astronaut.jpg'));
    I1=log(double(I0)+1);
    I2=fft2(I1);
    [m,n]=size(I2);
    N=2;c=2;
    T=7;
    rh=2;rl=0.5;
    for i=1:m
        for j=1:n
            d=sqrt(i^2+j^2);
            h=rl+(rh-rl)*(1/(1+(T/(c*d))^(2*N)));
            I2(i,j)=I2(i,j)*h;
        end
    end
    I3=ifft2(I2);
    I4=(exp(I3)-1);
    figure,
    subplot(1,2,1),imshow(I0);
    subplot(1,2,2),imshow(uint8(real(I4)));
    

    结果:
    在这里插入图片描述
    分析:
    (其实觉得这个结果没有很好,而且实验了很多照片,也没有找到效果好的)结果就是增强了图片的对比度,而且,阈值T越大,曝光度越小。


    1. 出自杨杰主编的《数字图像处理及MATLAB实现(第2版)》 ↩︎

    展开全文
  • 频率域图像增强

    2013-12-12 23:21:29
    数字图像处理 频率域滤波 图像增强
  • 1. 平滑的频率域滤波器 理想低通滤波器ILPF:半径为D0的圆内所有频率无衰减,之外全部衰减。 巴特沃斯滤波器BLPF:阶数越高越接近理想低通滤波器,振铃效应越大。一阶没有振铃效应,二阶微小,是有效的低通滤波...
  • 图像增强处理:设计一套空间域与频率域结合的图像增强算法,处理以下任一组图片中的带噪声图像,去除噪声,提高图像质量。 (1)已知:噪声为随机噪声和周期噪声混合噪声; (2)要求: a)去噪处理后,计算均方误差...
  • 频域增强指在图像频率域内,对图像的变换系数(频率成分)直接进行运算,然后通过Fourier逆变换以获得图像增强效果。
  • 冈萨雷斯《MATLAB数字图像处理教程》第四章“频率域增强
  • 数字图像处理频率域图像增强

    千次阅读 2012-03-25 12:35:04
    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、...图像进行傅立叶运算的物理意义 http://met.fzu.edu.cn/dip/chapter4.html http://www.360doc.com/content/10/1128/20/2226925_73234298.shtml h
  • 文章目录频率域图像增强1. 傅里叶变换1.1 一维傅里叶变换总结 频率域图像增强 1. 傅里叶变换 1.1 一维傅里叶变换 单变量连续函数f(x)的傅里叶变换F(u)定义为等式: 反变换可以定义为: 上述这两个式子,就反映了...
  •   图像增强(Image Enhancement)是一种基本的图像处理技术,主要是为了改善图像的质量以及增强感兴趣部分,改善图像的视觉效果或使图像变得更利于计算机处理。   如曝光不足或过度的图像需要增强处理;   ...
  • 1 背景介绍 前情提要: 傅里叶指出:任何周期函数都可以表示为不同频率的正弦和或余弦和的形式,每个正弦和或余弦和乘以不同的系数。 2.傅里叶变换和频率域介绍
  • 冈萨雷斯版里面的解释非常形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来...Fourier theory讲的就是:任何信号(如图像信号)都可
  • 本节书摘来自异步社区《精通Matlab数字图像处理与识别...精通Matlab数字图像处理与识别空间域和频率域为我们提供了不同的视角。在空间域中,函数的自变量(x,y)被视为二维空间中的一点,数字图像f(x,y)即为一个...
  • 图像处理设计主要有以下几种处理:图像增强(灰度变换、直方图增强、空间域滤波、频率域滤波)、图像分割、图像配准等等。 图像增强: 图像增强作为基本的图像处理技术,目的在于通过对图像进行加工使其比原始图像...
  • 数字图像处理-空间图像增强图像增强空间阈图像增强点处理模板处理 图像增强 空间阈图像增强 点处理 模板处理 图像增强技术 图像增强技术不需要考虑图像降质的原因,只将图像中感兴趣的特征有选择地突出,将不需要...
  • 三、频率域滤波 四、二维离散变换的性质 五、实现 六、相关资源 序言:对图像而言,空间频率是指单位长度内亮度作为周期性变化的次数! 一、傅里叶变换基础 一维傅里叶变换数学推导 首先,我们知道傅里叶级数...
  • 频率域图像增强

    千次阅读 2016-12-27 20:32:27
    频率域图像增强 高通滤波器和低通滤波器 本章的典型案例分析 利用频域滤波消除周期噪声 频域滤波基础频域滤波与空域滤波的关系 傅立叶变换可以将图像从空域变换到频域,而傅立叶反变换则可以将图像的频谱逆变换为...
  • 频率域的拉普拉斯算子  钝化模板、高频提升滤波和高频加强 滤波   %高通滤波 f=imread('e.tif'); [f,revertclass]=tofloat(f); PQ=paddedsize(size(f)); [u,v]=dftuv(PQ(1),PQ(2)); D=hypot(u,v); %...
  • 傅里叶变换:傅里叶变换在这里不做介绍,数字图像处理中主要是关注二维离散函数的傅里叶变换(DFT)。 快速傅里叶变换:利用傅里叶变换中变量的周期性和对称性,可以进行简化运算,便于实现。(FFT) ...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 240
精华内容 96
关键字:

图像处理频率域增强