代碼發到github上了:https://github.com/gzb126/Some-simple-handling-of-imagesgit
說明:github
1. 題目要求給出使用MATLAB等語言的實現過程,除了基本的函數以外,要求自行編寫相應的代碼實現題目要求的功能。app
2. 每一個題目要求給出代碼和適當的註釋,並輸出處理結果。函數
3. 作完題目後使用A4紙打印出來,本學期最後一次課提交,不容許雷同和抄襲。ui
1、讀取下面的一幅圖像,採用直方圖均衡化的方法加強該圖像。spa
解答:code
圖1:原圖的灰度圖
圖2:進行直方圖均衡化後的圖像orm
圖3:原圖灰度圖的直方圖 圖4:進行直方圖均衡化後的直方圖 圖5:灰度變換函數blog
代碼實現:圖片
1 from PIL import Image 2 from pylab import * 3 from numpy import * 4 5 6 def histeq(im,nbr_bins = 256): 7 """對一幅灰度圖像進行直方圖均衡化""" 8 #計算圖像的直方圖 9 #在numpy中,也提供了一個計算直方圖的函數histogram(),第一個返回的是直方圖的統計量,第二個爲每一個bins的中間值 10 imhist,bins = histogram(im.flatten(),nbr_bins,normed= True) 11 cdf = imhist.cumsum() # 12 cdf = 255.0 * cdf / cdf[-1] #累 計函數歸一化(由0~1變換至0~255) 13 #使用累積分佈函數的線性插值,計算新的像素值 14 im2 = interp(im.flatten(),bins[:-1],cdf) 15 #interp(x,xp,yp) 輸入原函數的一系列點(xp,yp),使用線性插值方法模擬函數並根據這個函數計算f(x) 16 return im2.reshape(im.shape),cdf 17 18 19 pil_im = Image.open('/home/gzb/PycharmProjects/homework/data/a.png') #打開原圖 20 pil_im_gray = pil_im.convert('L') #轉化爲灰度圖像 21 pil_im_gray.show() #顯示灰度圖像 22 23 im = array(Image.open('/home/gzb/PycharmProjects/homework/data/a.png').convert('L')) 24 figure() 25 hist(im.flatten(),256) # 原圖 26 27 im2,cdf = histeq(im) 28 figure() 29 hist(im2.flatten(),256) 30 show() #加強後的 31 32 im2 = Image.fromarray(uint8(im2)) 33 im2.show() 34 im2.save("/home/gzb/PycharmProjects/homework/res/1_res.png") # 保存加強後的圖
2、讀取一幅灰度圖像,編寫程序實現圖像的放大,而且旋轉30°,並輸出顯示結果。
解答:
首先來生成一個灰度的圖像吧,隨便找了個可愛的貓咪。
圖1、原圖 圖2、灰度圖
代碼:
#coding=utf-8 from PIL import Image #灰度化 infile = '/home/gzb/PycharmProjects/homework/data/CAT_2.jpeg' #原始圖像路徑 outfile= '/home/gzb/PycharmProjects/homework/res/cat.jpg' #灰度化後的圖像路徑 im = Image.open(infile).convert('L') #灰度化 out = im.resize((200,150),Image.ANTIALIAS) #從新定義圖片尺寸大小 out.save(outfile) #存儲圖片
圖像放大:
1 # encoding:utf-8 2 import cv2 3 import numpy as np 4 ###############方法一################# 5 # 讀取圖片 6 src = cv2.imread('/home/gzb/PycharmProjects/homework/res/cat.jpg') 7 # # 圖像縮放 8 result = cv2.resize(src, (400, 400)) #(列數,行數) 9 10 print(result.shape) 11 # 顯示圖像 12 cv2.imshow("src", src) 13 cv2.imshow("result", result) 14 # 等待顯示 15 cv2.waitKey(0) 16 cv2.destroyAllWindows() 17 18 #####################方法二########################## 19 # 讀取圖片 20 rows, cols = src.shape[:2] 21 print(rows, cols) 22 # 圖像縮放 23 result_1 = cv2.resize(src, None, fx=2, fy=2) 24 print(result_1.shape) 25 # 顯示圖像 26 cv2.imshow("src", src) 27 cv2.imshow("result_1", result_1) 28 # 等待顯示 29 cv2.waitKey(0) 30 cv2.destroyAllWindows()
左上原圖,右圖不規則放大,左下放大2倍
旋轉30度,繞中心旋轉:
# encoding:utf-8 import cv2 import numpy as np ########旋轉30度############# # 讀取圖片 src = src = cv2.imread('/home/gzb/PycharmProjects/homework/res/cat.jpg') # 原圖的高、寬 以及通道數 rows, cols, channel = src.shape # 繞圖像的中心旋轉 # 參數:旋轉中心 旋轉度數 scale M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 30, 1) # 參數:原始圖像 旋轉參數 元素圖像寬高 rotated = cv2.warpAffine(src, M, (cols, rows)) # 顯示圖像 cv2.imshow("src", src) cv2.imshow("rotated", rotated) # 等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
上圖爲原圖,下圖爲旋轉後的圖
3、讀取一幅灰度圖像,將圖像進行3級的小波分解,並輸出多尺度分解的結果圖。
MATALAB代碼:
x=imread('G:girl_1.JPEG'); x1=rgb2gray(x); B= imresize(x1, [256 256]); subplot(2,1,1); imshow(B); title('原始圖像'); [c,s]=wavedec2(B,3,'db1'); ch1=detcoef2('h',c,s,1); cv1=detcoef2('v',c,s,1); cd1=detcoef2('d',c,s,1); ch2=detcoef2('h',c,s,2); cv2=detcoef2('v',c,s,2); cd2=detcoef2('d',c,s,2); ca3=appcoef2(c,s,'haar',3); ch3=detcoef2('h',c,s,3); cv3=detcoef2('v',c,s,3); cd3=detcoef2('d',c,s,3); show1=[ca3,ch3;cv3,cd3]; show2=[show1,ch2;cv2,cd2]; show3=[show2,ch1;cv1,cd1]; [m,n]=size(B); mm = zeros(m,n); mm = [show2,ch1;cv1,cd1]; dim = 3; for i=1:dim m=m-mod(m,2); n=n-mod(n,2); mm(m/2,1:n)=255; mm(1:m,n/2)=255; m=m/2; n=n/2; end subplot(2,1,2); imshow(mm,[]); title('分解後圖像')
輸出結果:
4、編寫程序實現二值形態學處理中的膨脹、腐蝕運算,並使用形態學操做實現一幅圖像的邊緣檢測。
解答:
1 import cv2 2 import numpy as np 3 original_img = cv2.imread('/home/gzb/PycharmProjects/homework/data/4.1.jpeg') 4 res = cv2.resize(original_img,None,fx=0.6, fy=0.6, 5 interpolation = cv2.INTER_CUBIC) #圖形太大了縮小一點 6 B, G, R = cv2.split(res) #獲取紅色通道 7 img = R 8 _,RedThresh = cv2.threshold(img,160,255,cv2.THRESH_BINARY) 9 #OpenCV定義的結構矩形元素 10 kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3)) 11 eroded = cv2.erode(RedThresh,kernel) #腐蝕圖像 12 dilated = cv2.dilate(RedThresh,kernel) #膨脹圖像 13 14 cv2.imshow("original_img", res) #原圖像 15 cv2.imshow("Eroded Image",eroded) #顯示腐蝕後的圖像 16 cv2.imshow("Dilated Image",dilated) #顯示膨脹後的圖像 17 18 # #NumPy定義的結構元素 19 NpKernel = np.uint8(np.ones((3,3))) 20 Nperoded = cv2.erode(RedThresh,NpKernel) #腐蝕圖像 21 # cv2.imshow("Eroded by NumPy kernel",Nperoded) #顯示腐蝕後的圖像 22 cv2.waitKey(0) 23 cv2.destroyAllWindows()
輸出結果:
邊緣檢測:
import cv2 import numpy image = cv2.imread("/home/gzb/PycharmProjects/homework/data/girl.jpg",cv2.IMREAD_GRAYSCALE) kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5)) ##膨脹壓縮的像素範圍 dilate_img = cv2.dilate(image, kernel) erode_img = cv2.erode(image, kernel) """ 我選了一張較好的圖片,有的圖片要去噪(高斯模糊) 將兩幅圖像相減得到邊;cv2.absdiff參數:(膨脹後的圖像,腐蝕後的圖像) 上面獲得的結果是灰度圖,將其二值化以便觀察結果 反色,對二值圖每一個像素取反 """ absdiff_img = cv2.absdiff(dilate_img,erode_img); retval, threshold_img = cv2.threshold(absdiff_img, 40, 255, cv2.THRESH_BINARY); result = cv2.bitwise_not(threshold_img); cv2.imshow("yuantu",image) cv2.imshow("dilate_img",dilate_img) cv2.imshow("erode_img",erode_img) cv2.imshow("absdiff_img",absdiff_img) cv2.imshow("threshold_img",threshold_img) cv2.imshow("result",result) cv2.waitKey(0) cv2.destroyAllWindows()
上左:原圖,上中:腐蝕,上右:膨脹
下左:腐蝕取反色,下中:膨脹取反,下右,差
5、讀取下面的一幅圖像,經過顏色類似度原理分割出圖片中綠色的葉子。
代碼以下:
1 import cv2 2 import numpy as np 3 4 ############# 5 6 # 綠色 7 lower_green = np.array([35, 43, 46]) 8 upper_green = np.array([77, 255, 255]) 9 10 ################### 11 img = cv2.imread('/home/gzb/PycharmProjects/homework/data/b.png') 12 13 # get a frame and show 14 15 frame = img 16 17 cv2.imshow('Capture', frame) ######顯示原圖 18 19 # change to hsv model 20 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 21 22 # get mask 23 mask = cv2.inRange(hsv, lower_green, upper_green) 24 cv2.imshow('Mask', mask) ######提取目的顏色圖的黑白輪廓 25 # detect green 26 res = cv2.bitwise_and(frame, frame, mask=mask) 27 cv2.imshow('Result', res) ####顯示提取的綠色圖片 28 29 30 cv2.waitKey(0) 31 cv2.destroyAllWindows()
效果圖: