代码发到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()
效果图: