2018~2019學年下學期《計算機圖像處理》

代碼發到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()

 

效果圖:

                         

相關文章
相關標籤/搜索