import sys import cv2 import os import numpy as np def robs(): cap = cv2.VideoCapture(0) ok, src = cap.read() cap.release() #src = cv2.imread('./zero.jpg') if ok: img = src ########## Begin ########## # 1. 灰度化处理图像 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. Roberts算子 kernelx = np.array([[-1, 0], [0, 1]], dtype=int) kernely = np.array([[0, -1], [1, 0]], dtype=int) # 3. 卷积操作 x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx) y = cv2.filter2D(grayImage, cv2.CV_16S, kernely) # 4. 数据格式转换 absX = cv2.convertScaleAbs(x) absY = cv2.convertScaleAbs(y) Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0) ########## End ########## print(src.shape) #单通道转为三通道 Roberts=cv2.cvtColor(Roberts, cv2.COLOR_GRAY2RGB) img = np.hstack([src, Roberts]) cv2.imshow("resourse and result", img) # 等待关闭 cv2.waitKey(0) def sob(): cap = cv2.VideoCapture(0) ok, src = cap.read() cap.release() if ok: img = src ########## Begin ########## # 1. 灰度化处理图像 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 求Sobel 算子 x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0) # 对x求一阶导 y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1) # 对y求一阶导 absX = cv2.convertScaleAbs(x) absY = cv2.convertScaleAbs(y) Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0) ########## End ########## Sobel = cv2.cvtColor(Sobel, cv2.COLOR_GRAY2RGB) img = np.hstack([src, Sobel]) cv2.imshow("resourse and result", img) # 等待关闭 cv2.waitKey(0) def pre(): cap = cv2.VideoCapture(0) ok, src = cap.read() cap.release() if ok: img = src ########## Begin ########## # 1. 灰度化处理图像 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int) kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int) x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx) y = cv2.filter2D(grayImage, cv2.CV_16S, kernely) # 转uint8 absX = cv2.convertScaleAbs(x) absY = cv2.convertScaleAbs(y) Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0) Prewitt = cv2.cvtColor(Prewitt, cv2.COLOR_GRAY2RGB) ########## End ########## img = np.hstack([src, Prewitt]) cv2.imshow("resourse and result", img) # 等待关闭 cv2.waitKey(0) def lap(): cap = cv2.VideoCapture(0) ok, src = cap.read() cap.release() if ok: img = src ########## Begin ########## # 1. 灰度化处理图像 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 高斯滤波 grayImage= cv2.GaussianBlur(grayImage, (5, 5), 0) # 3. 拉普拉斯算法 dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize=3) # 4. 数据格式转换 Laplacian = cv2.convertScaleAbs(dst) Laplacian = cv2.cvtColor(Laplacian, cv2.COLOR_GRAY2RGB) ########## End ########## img = np.hstack([src, Laplacian]) cv2.imshow("resourse and result", img) # 等待关闭 cv2.waitKey(0) def Blur(): cap = cv2.VideoCapture(0) ok, src = cap.read() cap.release() if ok: img = src #source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) result = cv2.blur(img, (3, 3)) img = np.hstack([src, result]) cv2.imshow("resourse and result", img) # 等待关闭 cv2.waitKey(0) def medianblur(): cap = cv2.VideoCapture(0) ok, src = cap.read() cap.release() if ok: img = src result = cv2.medianBlur(img, 5) img = np.hstack([src, result]) cv2.imshow("resourse and result", img) # 等待关闭 cv2.waitKey(0) def gauss(): cap = cv2.VideoCapture(0) ok, src = cap.read() cap.release() if ok: img = src result = cv2.GaussianBlur(img, (3, 3), 0) img = np.hstack([src, result]) cv2.imshow("resourse and result", img) # 等待关闭 cv2.waitKey(0) def ideal_high_filter(img, D0): """ 生成一个理想高通滤波器(并返回) """ h, w = img.shape[:2] filter_img = np.zeros((h, w)) u = np.fix(h / 2) v = np.fix(w / 2) for i in range(h): for j in range(w): d = np.sqrt((i - u) ** 2 + (j - v) ** 2) filter_img[i, j] = 0 if d < D0 else 1 return filter_img def butterworth_high_filter(img, D0, rank): """ 生成一个Butterworth高通滤波器(并返回) """ h, w = img.shape[:2] filter_img = np.zeros((h, w)) u = np.fix(h / 2) v = np.fix(w / 2) for i in range(h): for j in range(w): d = np.sqrt((i - u) ** 2 + (j - v) ** 2) filter_img[i, j] = 1 / (1 + (D0 / d) ** (2 * rank)) return filter_img def exp_high_filter(img, D0, rank): """ 生成一个指数高通滤波器(并返回) """ h, w = img.shape[:2] filter_img = np.zeros((h, w)) u = np.fix(h / 2) v = np.fix(w / 2) for i in range(h): for j in range(w): d = np.sqrt((i - u) ** 2 + (j - v) ** 2) filter_img[i, j] = np.exp((-1) * (D0 / d) ** rank) return filter_img def filter_use(img, filter): """ 将图像img与滤波器filter结合,生成对应的滤波图像 """ # 首先进行傅里叶变换 f = np.fft.fft2(img) f_center = np.fft.fftshift(f) # 应用滤波器进行反变换 S = np.multiply(f_center, filter) # 频率相乘——l(u,v)*H(u,v) f_origin = np.fft.ifftshift(S) # 将低频移动到原来的位置 f_origin = np.fft.ifft2(f_origin) # 使用ifft2进行傅里叶的逆变换 f_origin = np.abs(f_origin) # 设置区间 f_origin = f_origin / np.max(f_origin.all()) return f_origin def ideal_high(): cap = cv2.VideoCapture(0) ok, frame = cap.read() src = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cap.release() if ok: img = src ideal_filter = ideal_high_filter(img, D0=40) ideal_img = filter_use(img, ideal_filter) cv2.imshow("resourse", src) cv2.imshow("result", ideal_img) # 等待关闭 cv2.waitKey(0) def butterworth_high(): cap = cv2.VideoCapture(0) ok, frame = cap.read() src = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cap.release() if ok: img = src butterworth_filter = butterworth_high_filter(img, D0=40, rank=2) butterworth_img = filter_use(img, butterworth_filter) cv2.imshow("resourse", src) cv2.imshow("result", butterworth_img) # 等待关闭 cv2.waitKey(0) def exp_high(): cap = cv2.VideoCapture(0) ok, frame = cap.read() src = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cap.release() if ok: img = src exp_filter = exp_high_filter(img, D0=40, rank=2) exp_img = filter_use(img, exp_filter) cv2.imshow("resourse", src) cv2.imshow("result", exp_img) # 等待关闭 cv2.waitKey(0) def get_gray(): cap = cv2.VideoCapture(0) ok, frame = cap.read() src = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cap.release() return src def filter(img, D0, type, filter, N=2): ''' 频域滤波器 Args: img: 灰度图片 D0: 截止频率 N: butterworth的阶数(默认使用二阶) type: lp-低通 hp-高通 filter:butterworth、ideal、Gaussian即巴特沃斯、理想、高斯滤波器 Returns: imgback:滤波后的图像 ''' # 离散傅里叶变换 dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) # 中心化 dtf_shift = np.fft.fftshift(dft) rows, cols = img.shape crow, ccol = int(rows / 2), int(cols / 2) # 计算频谱中心 mask = np.zeros((rows, cols, 2)) # 生成rows行cols列的二维矩阵 for i in range(rows): for j in range(cols): D = np.sqrt((i - crow) ** 2 + (j - ccol) ** 2) # 计算D(u,v) if (filter.lower() == 'butterworth'): # 巴特沃斯滤波器 if (type == 'lp'): mask[i, j] = 1 / (1 + (D / D0) ** (2 * N)) elif (type == 'hp'): mask[i, j] = 1 / (1 + (D0 / D) ** (2 * N)) else: assert ('type error') elif (filter.lower() == 'ideal'): # 理想滤波器 if (type == 'lp'): if (D <= D0): mask[i, j] = 1 elif (type == 'hp'): if (D > D0): mask[i, j] = 1 else: assert ('type error') elif (filter.lower() == 'gaussian'): # 高斯滤波器 if (type == 'lp'): mask[i, j] = np.exp(-(D * D) / (2 * D0 * D0)) elif (type == 'hp'): mask[i, j] = (1 - np.exp(-(D * D) / (2 * D0 * D0))) else: assert ('type error') fshift = dtf_shift * mask f_ishift = np.fft.ifftshift(fshift) img_back = cv2.idft(f_ishift) img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1]) # 计算像素梯度的绝对值 img_back = np.abs(img_back) return img_back def main(): print("1.空域的锐化 2.空域的平滑 3.频域的锐化 4.频域的平滑") cin = input() if cin == '1': print("选择锐化的方式:1.Roberts锐化 2.Sobel锐化 3.Laplacian锐化 4.Prewitt锐化") myinput = input() if myinput == '1': robs() elif myinput == '2': sob() elif myinput == '3': lap() elif myinput == '4': pre() else: print("wrong input!") elif cin == '2': print("选择要使用的滤波器: 1.均值滤波 2.中值滤波 3.高斯滤波") myinput = input() if myinput == '1': Blur() elif myinput == '2': medianblur() elif myinput == '3': gauss() else: print("Wrong input!") elif cin == '3': print("选择要使用的滤波器: 1.理想高通滤波 2.巴特沃斯高通滤波 3.指数高通滤波器") myinput = input() if myinput == '1': ideal_high() elif myinput == '2': butterworth_high() elif myinput == '3': exp_high() else: print("Wrong input!") elif cin == '4': print("选择要使用的滤波器: 1.理想低通滤波 2.巴特沃斯低通滤波 3.指数低通滤波器") myinput = input() if myinput == '1': src = get_gray() img = filter(src, 30, type='lp', filter='ideal') cv2.imshow("resourse", src) cv2.imshow("result", img) # 等待关闭 cv2.waitKey(0) elif myinput == '2': src = get_gray() img = filter(src, 30, type='lp', filter='butterworth') cv2.imshow("resourse", src) cv2.imshow("result", img) # 等待关闭 cv2.waitKey(0) elif myinput == '3': src = get_gray() img = filter(src, 30, type='lp', filter='gaussian') cv2.imshow("resourse", src) cv2.imshow("result", img) cv2.waitKey(0) else: print("Wrong input!") else: print("Wrong input!")