计算机视觉:混合图像处理(MAC)

(提前说明:因为是视觉小白,所以一边做一边记录,如果有什么不对的地方指点哦-----from:西电不知名博主)

1,简介

  1. 概述
    编写图像滤波函数,实验目标是编写一个图像滤波函数,并用它基于 Oliva、Torralba 和 Schyns 在SIGGRAPH 2006发表的题为“Hybrid images”的论文的简化版本创建混合图像。。其基本思想是, 高频往往在感知中占主导地位,但在远处,只能看到信号的低频(平滑)部分。通过将一幅图像的高频部分与另一幅图像的低频部分混合,可以得到一幅混合图像, 在不同的距离产生不同的解释。

  2. 完成目标
    图像滤波,高斯模糊,高通和低通滤波器

  3. 实验环境
    因为是在MAC下做的,所以下面一切环境都在MAC搭建。
    先在Linux或Windows上安装Python2(因为有一些调试是基于py2,所以不写py3),之后安装Numpy和OpenCV for python。
    OpenCV 用于读写图像文件,Numpy 用于实现滤波等函数。
    有必要的话还要安装PIL(pillow),如果要运行一些调试的GUI

2,环境搭建

  1. python运行环境(如果MAC自带了py的台子,可以跳过)
    因为是个小白,所以这次没有在pycharm上进行,而是直接弄了python2.7.14的IDLE,如果后续弄出来了,会进行改进,直接选择版本安装即可,附上链接。可以在终端找到
    [link]https://www.python.org/downloads/
    终端检查

  2. 安装包numpy与pillow
    可以直接在终端用的 Python 包管理工具pip进行安装,然后导入包检查

  pip install numpy //终端指令
  pip install pillow//

然后进行检查,可以直接在IDLE中检查,或者终端检查(附上终端图),这样就是成功了。
检查numpy

  1. 安装Opencv for python
    这一步花了我三个小时,具体原因主要有两个,一个是电脑上不去github,第二个是homebrew的问题。所以再安装cv前,尽量确保在一个网络好的地方。
    因为用pip装会出现的问题比较多,所以我是用MAC自带的homebrew进行安装。(如果电脑没有安装homebrew,可以参考https://blog.csdn.net/y201314an/article/details/84179536) 如果安装不了,终端报错在上不去github上,可以采用以下办法修改代理试一下;
    hosts文件进行修改: hosts文件路径:前往文件夹 -> /etc/hosts
    找到hosts文件将如下链接复制到hosts文件中
http://github.com 204.232.175.94 http://gist.github.com 107.21.116.220
http://help.github.com 207.97.227.252 http://nodeload.github.com 199.27.76.130
http://raw.github.com 107.22.3.110 http://status.github.com 204.232.175.78
http://training.github.com 207.97.227.243 http://www.github.com

然后直接终端输入安装

brew install opencv for python//因为opencv有很多版本,而只有一些能用在python上,或者可以写成下面
brew install opencv3//

如果顺利的话就会直接安装成功出现successful,但是这应该是不可能的,多数情况会直接卡在updating homebrew(如果你的homebrew刚装上的话,或许不会有这个问题),这个时候可以多等一会,但是一般情况下很等很久,此时可以尝试两个方法:
1,卸载homebrew再重新安装,在上面安装homebrew的链接里有具体的指令。
2,替换brew源

#替换brew.git
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

#替换homebrew-core.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
brew update

备用地址

#替换brew.git
cd "$(brew --repo)"
git remote set-url origin https://git.coding.net/homebrew/homebrew.git
brew update

如果不管用,那就再将其换回原来的地址

#重置brew.git
cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git

#重置homebrew-core.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://github.com/Homebrew/homebrew-core.git

此时应该就能安装成功,如果安装一半失败,可以再多试几次,可能是网络原因,我就是突然在半夜安上去了。
如果安装完成后,无法import,那可能是opencv的版本不符合,重新安装,注意安装指令中写上版本号的版本号,3开头的一般都是给python用的。引入成功后可以直接搞代码引入图片进行验证,注意图片存放的路径。

3,开始制作

  • 我们需要实现对cat图的模糊处理,dog图高通滤波,再将两图混合,做成混合图像。
    DOGCAT
  • 需要实现的函数
    1. cross_correlation_2d //互相关函数
    2. convolve_2d //卷积函数
    3. gaussian_blur_kernel_2d //产生高斯核
    4. low_pass //低通变化
    5. high_pass //高通变化

下面附上我的代码(其中五个主要函数可参考https://blog.csdn.net/qq_36124802/article/details/88636487)

import PIL
from PIL import Image
import cv2
import numpy as np

def cross_correlation_2d(img, kernel):  #互相关函数
    img_array = np.array(img)  
    r= img_array.shape[0]
    c = img_array.shape[1]  
    h = img_array.shape[2]  
    r2 = kernel.shape[0]  # 核的行
    c2 = kernel.shape[1]  # 核的列
    new1 = np.zeros((r, (int)(c2 / 2)), np.int)  
    new2= np.zeros(((int)(r2/ 2), c + new1.shape[1] * 2), np.int)
    conv = np.zeros((r, c, h))
    for i in range(3): 
        temp_img_array = np.hstack([new1, np.hstack([img_array[:, :, i], new1])]) 
        new_img_array = np.vstack([new2, np.vstack([temp_img_array, new2])])
        for j in range(r):
            for k in range(c):
                conv[j][k][i] = min(max(0,(new_img_array[j:j + r2, k:k + c2]* kernel).sum()),255)
                
    return conv 

def convolve_2d(img, kernel):#卷积
    kernel2 = np.rot90(np.fliplr(kernel), 2) #将图片进行2次逆时针90度翻转
    return cross_correlation_2d(img, kernel2)  

def gaussian_blur_kernel_2d(sigma, height, width): #产生一个高斯核
    gaussian_kernel = np.zeros((height, width), dtype='double')
    center_row = height/2
    center_column = width/2
    s = 2*(sigma**2)
    for i in range(height):
        for j in range(width):
            x = i - center_row
            y = j - center_column
            gaussian_kernel[i][j] = (1.0/(np.pi*s))*np.exp(-float(x**2+y**2)/s)

    
    return gaussian_kernel   # 返回高斯核

def low_pass(img, sigma,height, width):  #低通函数
    res = gaussian_blur_kernel_2d(sigma,  height, width) #res为一个高斯核
    return convolve_2d(img,res) #进行卷积

 
def high_pass(img,sigma, height, width): #高通函数
    Image = np.array(img)
    return (img-low_pass(Image,sigma, height, width)) #做一个减法得到高通图像

def create_hybrid_image(img1, img2, sigma1, height1, width1, sigma2, height2,width2, mixin_ratio):
    img1_res = low_pass(img1,sigma1,height1,width1)#得到低通图像
    img2_res = high_pass(img2,sigma2,height2,width2) #得到高通图像
    cv2.imwrite('left.jpg', img1_res)
    cv2.imwrite('right.jpg', img2_res)
    img_res = cv2.addWeighted(img1_res, mixin_ratio, img2_res, mixin_ratio, 0) #图像混合加权函数 
    return cv2.imwrite('hybrid.jpg', img_res)

主函数:

img1 = Image.open('./dog.jpg')
img2 = Image.open('./cat.jpg')
mixin_ratio = input("Please input ratio:")
sigma1 = input("Please input sigma1 for low_pass:")
height1 = input("Please input height1 for low_pass:")
width1 = input("Please input width1 for low_pass:")
sigma2 = input("Please input sigma2 for high_pass:")
height2 = input("Please input height2 for high_pass:")
width2 = input("Please input width2 for high_pass:")
create_hybrid_image(img1, img2, sigma1, height1, width1, sigma2, height2,width2, mixin_ratio)

说明

1,其中opencv中带的函数addWeighred是将两张大小相同,相同类型的图像融合的函数。参数一代表第一个原图片,参数二为第一个图片元素权重,参数三参数四为第二个图片,参数五为做和后添加的数值,总和255以上为白色,参数六为输出。

2,我把图片的处理过程写为了一个主函数,代码运行后,可自定义输入对两个图处理的参数:
Mixin_ratio :图片所占权重
sigma1:低通图的标准差
height1:低通图卷积核的长
width1:低通图卷积核的宽
sigma2:高通图的标准差
height2:高通图卷积核的长
width2:高通图卷积核的宽

一些结果

1)对应参数(卷积核大小13*13,标注差sigma=1,ratio=0.6)
结果:(left,right,hybrid)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)对应参数(卷积核大小13*13,标注差sigma=5,ratio=0.6)
结果:(left,right,hybrid)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考文章:http://www.cocoachina.com/articles/31388

发布了1 篇原创文章 · 获赞 0 · 访问量 53
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览