锐化与平滑
Lapalce
import sys import cv2 as cv def main(argv): # [variables] # Declare the variables we are going to use ddepth = cv.CV_16S kernel_size = 3 window_name = "Laplace Demo" # [variables] # [load] imageName = argv[0] if len(argv) > 0 else 'D:/lena.jpg' src = cv.imread((imageName), cv.IMREAD_COLOR) # Load an image # Check if image is loaded fine if src is None: print ('Error opening image') print ('Program Arguments: [image_name -- default lena.jpg]') return -1 # [load] # [reduce_noise] # Remove noise by blurring with a Gaussian filter src = cv.GaussianBlur(src, (3, 3), 0) # [reduce_noise] # [convert_to_gray] # Convert the image to grayscale src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) # [convert_to_gray] # Create Window cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE) # [laplacian] # Apply Laplace function dst = cv.Laplacian(src_gray, ddepth, ksize=kernel_size) # [laplacian] # [convert] # converting back to uint8 abs_dst = cv.convertScaleAbs(dst) # [convert] # [display] cv.imshow(window_name, abs_dst) cv.waitKey(0) # [display] return 0 if __name__ == "__main__": main(sys.argv[1:])
另外一种代码:
from __future__ import print_function import sys import time import numpy as np import cv2 as cv ## [basic_method] def is_grayscale(my_image): return len(my_image.shape) < 3 def saturated(sum_value): if sum_value > 255: sum_value = 255 if sum_value < 0: sum_value = 0 return sum_value ## [basic_method] def main(argv): filename = 'D:/lena.jpg' img_codec = cv.IMREAD_COLOR if argv: filename = sys.argv[1] if len(argv) >= 2 and sys.argv[2] == "G": img_codec = cv.IMREAD_GRAYSCALE src = cv.imread(filename, img_codec) if src is None: print("Can't open image [" + filename + "]") print("Usage:") print("mat_mask_operations.py [image_path -- default lena.jpg] [G -- grayscale]") return -1 cv.namedWindow("Input", cv.WINDOW_AUTOSIZE) #cv.namedWindow("Output", cv.WINDOW_AUTOSIZE) cv.namedWindow("Built-in", cv.WINDOW_AUTOSIZE) cv.imshow("Input", src) t = time.time() ## [kern] kernel = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], np.float32) # kernel should be floating point type ## [kern] ## [filter2D] dst1 = cv.filter2D(src, -1, kernel) # ddepth = -1, means destination image has depth same as input image ## [filter2D] t = (time.time() - t) print("Built-in filter2D time passed in seconds: %s" % t) cv.imshow("Built-in", dst1) cv.waitKey(0) cv.destroyAllWindows() return 0 if __name__ == "__main__": main(sys.argv[1:])
平滑Smoothing:
import sys import cv2 as cv import numpy as np # Global Variables DELAY_CAPTION = 1500 DELAY_BLUR = 100 MAX_KERNEL_LENGTH = 31 src = None dst = None window_name = 'Smoothing Demo' def main(argv): cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE) # Load the source image imageName = argv[0] if len(argv) > 0 else 'D:/lena.jpg' global src src = cv.imread(imageName) if src is None: print ('Error opening image') print ('Usage: smoothing.py [image_name -- default ../data/lena.jpg] \n') return -1 if display_caption('Original Image') != 0: return 0 global dst dst = np.copy(src) if display_dst(DELAY_CAPTION) != 0: return 0 # Applying Homogeneous blur if display_caption('Homogeneous Blur') != 0: return 0 ## [blur] for i in range(1, MAX_KERNEL_LENGTH, 2): dst = cv.blur(src, (i, i)) if display_dst(DELAY_BLUR) != 0: return 0 ## [blur] # Applying Gaussian blur if display_caption('Gaussian Blur') != 0: return 0 ## [gaussianblur] for i in range(1, MAX_KERNEL_LENGTH, 2): dst = cv.GaussianBlur(src, (i, i), 0) if display_dst(DELAY_BLUR) != 0: return 0 ## [gaussianblur] # Applying Median blur if display_caption('Median Blur') != 0: return 0 ## [medianblur] for i in range(1, MAX_KERNEL_LENGTH, 2): dst = cv.medianBlur(src, i) if display_dst(DELAY_BLUR) != 0: return 0 ## [medianblur] # Applying Bilateral Filter if display_caption('Bilateral Blur') != 0: return 0 ## [bilateralfilter] # Remember, bilateral is a bit slow, so as value go higher, it takes long time for i in range(1, MAX_KERNEL_LENGTH, 2): dst = cv.bilateralFilter(src, i, i * 2, i / 2) if display_dst(DELAY_BLUR) != 0: return 0 ## [bilateralfilter] # Done display_caption('Done!') return 0 def display_caption(caption): global dst dst = np.zeros(src.shape, src.dtype) rows, cols, _ch = src.shape cv.putText(dst, caption, (int(cols / 4), int(rows / 2)), cv.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255)) return display_dst(DELAY_CAPTION) def display_dst(delay): cv.imshow(window_name, dst) c = cv.waitKey(delay) if c >= 0 : return -1 return 0 if __name__ == "__main__": main(sys.argv[1:])
关于cv.bilateralFilter ,参考:https://zhuanlan.zhihu.com/p/127023952