2018~2019学年下学期《计算机图像处理》

代码发到github上了:https://github.com/gzb126/Some-simple-handling-of-images

说明:

1. 题目要求给出使用MATLAB等语言的实现过程,除了基本的函数之外,要求自行编写相应的代码实现题目要求的功能。

2. 每个题目要求给出代码和适当的注释,并输出处理结果。

3. 做完题目后使用A4纸打印出来,本学期最后一次课提交,不允许雷同和抄袭。

 一、读取下面的一幅图像,采用直方图均衡化的方法增强该图像。

 

 

解答:

         图1:原图的灰度图  图2:进行直方图均衡化后的图像

图3:原图灰度图的直方图     图4:进行直方图均衡化后的直方图      图5:灰度变换函数

代码实现:

 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")  # 保存增强后的图

二、读取一幅灰度图像,编写程序实现图像的放大,并且旋转30°,并输出显示结果。

解答:

首先来生成一个灰度的图像吧,随便找了个可爱的猫咪。

图一、原图                                          图二、灰度图

     

代码:

#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级的小波分解,并输出多尺度分解的结果图。

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('分解后图像')

输出结果:

     

四、编写程序实现二值形态学处理中的膨胀、腐蚀运算,并使用形态学操作实现一幅图像的边缘检测。

 解答:

 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()

上左:原图,上中:腐蚀,上右:膨胀

下左:腐蚀取反色,下中:膨胀取反,下右,差

 

五、读取下面的一幅图像,通过颜色相似度原理分割出图片中绿色的叶子。

 

 代码如下:

 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()

 

效果图:

                         

转载于:https://www.cnblogs.com/cn-gzb/p/10832009.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值