# 影像處理 ### 輸出時間 ``` import datetime starttime = datetime.datetime.now() ``` ### 點擊出現該pixel資訊 ``` import numpy as np import cv2 global img def onMouse(event, x, y, flags, param): x, y = y, x if(event == cv2.EVENT_LBUTTONUP): if img.ndim != 3: print("(x,y) = (%d, %d)" % (x, y), end=" ") print("Gray-Level = %3d" % img[x, y]) else: print("(x,y) = (%d, %d)" % (x, y), end=" ") print("(R, G, B) = (%3d, %3d, %3d)" % (img[x, y, 2], img[x, y, 1], img[x, y, 0])) filename = "Ambassadors_s.jpg" img = cv2.imread(filename, -1) cv2.namedWindow(filename) cv2.setMouseCallback(filename, onMouse) cv2.imshow(filename, img) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### upsampling ``` def image_upsampling( f, sampling_rate ): fc=np.repeat(np.repeat(f,sampling_rate,axis=1),sampling_rate,axis=0) print(f.shape[0],f.shape[1]) print(fc.shape[0],fc.shape[1]) return fc def main( ): img1 = cv2.imread( "Lenna.bmp", -1 ) img2 = image_upsampling( img1, 2 ) cv2.imshow( "Original Image", img1 ) cv2.imshow( "Downsampling by 2", img2 ) cv2.waitKey( 0 ) cv2.destroyAllWindows() main( ) ``` ### 高斯打光$(f(x,y)=e^{\frac{x^2+y^2}{2\sigma^2}})$ ``` def image_formation_model( f, r0, c0, sigma ): g = f.copy( ) nr, nc = f.shape[:2] r1=r0-np.arange(0,nr) c1=np.arange(0,nc)-c0 [c,r]=np.meshgrid(c1,r1) illumination=np.exp( -( c ** 2 + r ** 2 ) /( 2 * sigma * sigma ) ) #cv2.imshow('sigma',illumination) #ill_3d=np.dstack((illumination,illumination,illumination)) #g=np.uint8(ill_3d*f) for k in range( 3 ): val = illumination * f[:,:,k] g[:,:,k] = np.uint8( val ) return g def main( ): img = cv2.imread( "Monet.bmp", -1 ) nr, nc = img.shape[:2] r0 = nr // 2 c0 = nc // 2 #r0=100 #光源中心 #c0=100 #光源中心 sigma = 400 #打光半徑 img2 = image_formation_model( img, r0, c0, sigma ) cv2.imshow( "Original Image", img ) cv2.imshow( "Image Formation Model", img2 ) cv2.waitKey( 0 ) cv2.destroyAllWindows() main( ) ``` ### image_quantization(gray) ``` def image_quantization(img, bits): img1 = img.copy() levels = 2**(8-bits) img2 = (np.floor(img1/levels)*levels).astype("uint8") return img2 def main(): filename = "Lenna.bmp" img = cv2.imread(filename, -1) bits = int(input("input bits:")) img1 = image_quantization(img, bits) cv2.imshow(filename, img1) cv2.waitKey(0) cv2.destroyAllWindows() main() ``` ### image_quantization(color) ``` def image_quantization(img, bits): img1 = img.copy() levels = 2**(8-bits) for i in range(3): img1[:,:,i] = (np.floor(img[:,:,i]/levels)*levels).astype("uint8") return img1 def main(): filename = "Baboon.bmp" img = cv2.imread(filename, -1) bits = int(input("input bits:")) img1 = image_quantization(img, 2) img2 = image_quantization(img, 3) img3 = image_quantization(img, 5) img4 = image_quantization(img, 6) cv2.imshow("a", img1) cv2.imshow("aa", img2) cv2.imshow("aaa", img3) cv2.imshow("aaaa", img4) cv2.waitKey(0) cv2.destroyAllWindows() main() ``` ### 內插法 ``` img = cv2.imread("book.jpg", -1) nr1, nc1 = img.shape[:2] nr2, nc2 = nr1//3, nc1//3 img1 = cv2.resize(img, (nc2, nr2), interpolation=cv2.INTER_NEAREST) img2 = cv2.resize(img1, (nc1, nr1), interpolation=cv2.INTER_NEAREST) img3 = cv2.resize(img, (nc2, nr2), interpolation=cv2.INTER_LINEAR) img3 = cv2.resize(img3, (nc1, nr1), interpolation=cv2.INTER_LINEAR) img4= cv2.resize(img, (nc2, nr2), interpolation=cv2.INTER_CUBIC) img4 = cv2.resize(img3, (nc1, nr1), interpolation=cv2.INTER_CUBIC) cv2.imshow("original", img) cv2.imshow("NEAREST", img2) cv2.imshow("bilinear", img3) cv2.imshow("bicubic", img4) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 影像旋轉 ``` import numpy as np import cv2 from math import * img1 = cv2.imread("lenna.bmp", -1) nr, nc = img1.shape[:2] center = (nc / 2, nr / 2) angle = int(input("input angle:")) % 360 rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1) abs_cos = abs(rotation_matrix[0, 0]) abs_sin = abs(rotation_matrix[0, 1]) bound_w = int(nr * abs_sin + nc * abs_cos) bound_h = int(nr * abs_cos + nc * abs_sin) rotation_matrix[0, 2] += bound_w/2 - center[0] rotation_matrix[1, 2] += bound_h/2 - center[1] img2 = cv2.warpAffine(img1, rotation_matrix, (bound_w, bound_h)) cv2.imshow("Original Image", img1) cv2.imshow("Image Rotation", img2) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 影像翻轉 ``` img1 = cv2.imread( "Poker.bmp", -1 ) img1=cv2.flip(img,0)//垂直翻轉 img1=cv2.flip(img,1)//水平翻轉 ``` ### 仿射轉換 ``` img1 = cv2.imread( "Poker.bmp", -1 ) nr, nc = img1.shape[:2] //原本圖的點 pts1 = np.float32([[ 270, 125],[ 160, 165 ], [ 240, 390 ]]) //目標的點 pts2 = np.float32([[ 310, 140],[ 190, 140 ], [ 190, 375 ]]) T = cv2.getAffineTransform( pts1, pts2 ) img2 = cv2.warpAffine( img1, T, ( nc, nr ) ) cv2.imshow( "Original Image", img1 ) cv2.imshow( "Affine Transform", img2 ) cv2.waitKey( 0 ) cv2.imwrite( "O.bmp", img2 ) cv2.destroyAllWindows() ``` ### 透視轉換 ``` img1 = cv2.imread("Gallery.bmp", -1) img3 = cv2.imread("book.jpg", -1) pts1 = np.float32([[0, 0],[0, img3.shape[0]],[ img3.shape[1], img3.shape[0]], [img3.shape[1], 0]]) pts2 = np.float32([[795, 350], [795, 690], [1090, 720], [1090, 250]]) T = cv2.getPerspectiveTransform(pts1, pts2) img2 = cv2.warpPerspective(img3, T, (img1.shape[1], img1.shape[0])) cv2.fillConvexPoly(img1,pts2.astype(int),0,16) img2=cv2.add(img1,img2) cv2.imshow("test", img2) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 高通濾波 ``` import cv2 import numpy as np def Roberts(img): kernalx = np.array([[1, 0], [0, -1]]) kernaly = np.array([[0, 1], [-1, 0]]) img_kernalx = cv2.filter2D(img, cv2.CV_32F, kernalx) img_kernaly = cv2.filter2D(img, cv2.CV_32F, kernaly) magnitude=abs(img_kernalx)+abs(img_kernaly) g=np.uint8(np.clip(magnitude,0,255)) return g def Prewitt(img): kernalx = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]]) kernaly = np.array([[1, 1, -1], [0, 0, 0], [-1, -1, -1]]) img_kernalx = cv2.filter2D(img, cv2.CV_32F, kernalx) img_kernaly = cv2.filter2D(img, cv2.CV_32F, kernaly) magnitude=abs(img_kernalx)+abs(img_kernaly) g=np.uint8(np.clip(magnitude,0,255)) return g def Sobel(img): kernalx = cv2.Sobel(img, cv2.CV_16S, 1, 0) kernaly = cv2.Sobel(img, cv2.CV_16S, 0, 1) absx = cv2.convertScaleAbs(kernalx) absy = cv2.convertScaleAbs(kernaly) img2 = cv2.addWeighted(absx, 0.5, absy, 0.5, 0) return img2 def Robinson(img): kernalx = np.array([[-1, -1, -1], [1, -2, 1], [1, 1, 1]]) kernaly = np.array([[-1, 1, 1], [-1, -2, 1], [-1, 1, 1]]) img_kernalx = cv2.filter2D(img, cv2.CV_32F, kernalx) img_kernaly = cv2.filter2D(img, cv2.CV_32F, kernaly) magnitude=abs(img_kernalx)+abs(img_kernaly) g=np.uint8(np.clip(magnitude,0,255)) return g def Kirsch(img): kernalx = np.array([[-5, -5, -5], [3, 0, 3], [3, 3, 3]]) kernaly = np.array([[-5, 3, 3], [-5, 0, 3], [-5, 3, 3]]) img_kernalx = cv2.filter2D(img, cv2.CV_32F, kernalx) img_kernaly = cv2.filter2D(img, cv2.CV_32F, kernaly) magnitude=abs(img_kernalx)+abs(img_kernaly) g=np.uint8(np.clip(magnitude,0,255)) return g def Laplacian(img): temp = cv2.Laplacian(img, cv2.CV_32F) + 128 g = np.uint8(np.clip(temp, 0, 255)) return g def composite_Laplacian(img):##混合拉普拉斯 kernal = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) temp = cv2.filter2D(img, cv2.CV_32F, kernal) g = np.uint8(np.clip(temp, 0, 255)) return g img = cv2.imread("Osaka.bmp", -1) ##cv2.imshow("Roberts", Roberts_img) img2=Robinson(img) img3=Kirsch(img) cv2.imshow("Robinson", img2) cv2.imshow("Kirsch", img3) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 高斯濾波 雙邊濾波 非銳化遮罩 中值濾波 ``` def Bilateral(img): g = cv2.bilateralFilter(img, 5, 50, 50) ##cv2.bilateralFilter(img,filter矩陣大小,50,50) return g def GetGaussianKernel2D(ksize, sigma): kernelX = cv2.getGaussianKernel(ksize[0], sigma).reshape(ksize[0], 1) kernelY = cv2.getGaussianKernel(ksize[1], sigma).reshape(1, ksize[1]) kernel = kernelX*kernelY return kernel def Gaussian(img): kernel = GetGaussianKernel2D((3, 3), 1) img2 = cv2.filter2D(img, -1, kernel, borderType=cv2.BORDER_DEFAULT) return img2 def Unsharp(img,k=1.0): ##k>1為高增濾波 f_avg = cv2.GaussianBlur(img, (3, 3), 0) g_mask = (img.astype(int))-(f_avg.astype(int)) g = np.uint8(np.clip(img+k*g_mask, 0, 255)) return g def medianfilter(img): img1=cv2.medianBlur(img,3) ##cv2.medianBlur(img,filter矩陣大小) return img1 ``` ### beta校正 gamma校正 直方圖等化 ```//beta校正 def beta_correction( f, a = 2.0, b = 2.0 ): g = np.uint8(( special.betainc( a, b, f/255 ))*255) return g ``` ```//gamma校正 def gamma_correction( f, gamma = 2.0 ): g=(f/255)**gamma g=np.uint8(g*255) return g ``` ```//直方圖等化 img1 = cv2.imread( "Indoor_Over_Exposure.bmp", -1 ) img2 = cv2.equalizeHist(img1) cv2.imshow( "Histogram Equalization", img2 ) cv2.waitKey( 0 ) cv2.destroyAllWindows() ```
{"metaMigratedAt":"2023-06-16T23:07:25.835Z","metaMigratedFrom":"Content","title":"影像處理","breaks":true,"contributors":"[{\"id\":\"74763879-60fd-4ae3-ae1c-b6a9f427a3fd\",\"add\":9371,\"del\":187}]"}
Expand menu