【计算机视觉 实验二 图像增强】

上一篇:计算机视觉 实验一 图像的基本操作

一、实验目的

  1. 图像的二值化处理;
  2. 分段线性变换;
  3. 均值滤波;
  4. sobel锐化;

实验仪器
Python、OpenCV、Matlab

二、实验内容及要求

1.获取实验用图像:GIL.jpeg,使用cv2.imread()函数将图像读入, 利用cv2. threshold(src, thresh, maxval, type[, dst])对输入的图像进行二值化处理,并通过设置不同的type值,讨论每种取种对图像效果的影响。
2. 产生灰度变换函数T1,使得:
0.3r r < 0.35
s = 0.105 + 2.6333(r-0.35) 0.35 ≤ r ≤ 0.65
1 + 0.3(r-1) r > 0.65
用T1对原图像rice.jpg进行处理,显示处理前、后的图像(r,s为归一化灰度)。
3. 对lena.bmp图像分别做33、55、77、99的均值滤波,并分析模板的大小对图像质量的影响。
4. 对lena.bmp图像做sobel锐化。

三、 实验程序

实验内容1:图像的二值化处理

设置了不同的type值:BINARY阈值,BINARY_INV阈值,TRIANGLE自适应阈值,OTSU自适应阈值,TRUNC截断阈值,TOZERO归零阈值

import cv2 as cv
def threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 230, 255, cv.THRESH_BINARY)
    print("BINARY阈值:%s" % ret)
    cv.imshow("BINARY", binary)

    ret, binary = cv.threshold(gray, 230, 255, cv.THRESH_BINARY_INV)
    print("BINARY_INV阈值:%s" % ret)
    cv.imshow("BINARY_INV_230", binary)
    
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_TRIANGLE)
    # ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)     print("TRIANGLE自适应阈值:%s" % ret)
    cv.imshow("TRIANGLE", binary)

    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)
    print("OTSU自适应阈值:%s" % ret)
    cv.imshow("OTSU", binary)

    ret, binary = cv.threshold(gray, 200, 255, cv.THRESH_TRUNC)
    print("TRUNC截断阈值:%s" % ret)
    cv.imshow("TRUNC_200", binary)

    ret, binary = cv.threshold(gray, 100, 255, cv.THRESH_TOZERO)
    print("TOZERO归零阈值:%s" % ret)
    cv.imshow("TOZERO_100", binary)
    
src1 = cv.imread("images4Exp2/GIL.jpeg")
cv.imshow("GIL", src1)
threshold_demo(src1)
cv.waitKey(0)
cv.destroyAllWindows()

实验内容2:分段线性变换

%matlab语言
a=imread('rice.jpg');
figure;
title('原图');
axis on;
imshow(a);
a=double(a)/256;
figure,imhist(a),title('原直方图');
axis on;
%r=[0:0.001:1];
%s1=[r<0.35].*r*0.3+[r<=0.65].*[r>=0.35].*(0.105+2.6333*(r-0.35))+[ r>0.65].*(1+0.3*(r-1));
a1=[a<0.35].*a*0.3+[a<=0.65].*[a>=0.35].*(0.105+2.6333*(a-0.35)) +[a>0.65].*(1+0.3*(a-1));
figure,imshow(a1),title('改后一');
axis on;
figure,imhist(a1),title('改后直方图一');
axis on;
imwrite(a1,'改后rice一.jpg');

实验内容3:均值滤波

%实验3:均值滤波

import cv2 as cv
import numpy as np
import math
import copy

def spilt( a ):
    if a/2 == 0:
        x1 = x2 = a/2
    else:
        x1 = math.floor( a/2 )
        x2 = a - x1
    return -x1,x2

def original (i, j, k,a, b,img):
    x1, x2 = spilt(a)
    y1, y2 = spilt(b)
    temp = np.zeros(a * b)
    count = 0
    for m in range(x1, x2):
        for n in range(y1, y2):
            if i + m < 0 or i + m > img.shape[0] - 1 or j + n < 0 or j + n > img.shape[1] - 1:
                temp[count] = img[i, j, k]
            else:
                temp[count] = img[i + m, j + n, k]
            count += 1
    return  temp

def average_function(a,b,img):
    img0=copy.copy(img)
    for i in range(0,img.shape[0]):
        for j in range(2,img.shape[1]):
            for k in range (img.shape[2]):
                temp = original(i, j, k, a, b, img0)
                img[i,j,k] = int ( np.mean(temp))
    return img 
    
def main():
    img0 = cv.imread(r"images4Exp2/lena.bmp")
    #(3,3)滤波器大小 
    ave_img3= average_function( 3 , 3, copy.copy(img0) )
    cv.imshow("3*3 Mean filtering",ave_img3) 
    #(5,5)滤波器大小
    ave_img5= average_function(5,5, copy.copy(img0) )  
    cv.imshow("5*5 Mean filtering",ave_img5) 
    #(7,7)滤波器大小
    ave_img7= average_function(7,7, copy.copy(img0) )  
    cv.imshow("7*7 Mean filtering",ave_img7)
    #(9,9)滤波器大小
    ave_img9= average_function(9,9,copy.copy(img0) )  
    cv.imshow("9*9 Mean filtering",ave_img9)
    cv.imshow("original",img0)
    cv.waitKey(0)
    cv.destroyAllWindows()

if __name__ == "__main__":
main()

实验内容4:sobel锐化

import cv2
import numpy as np
#导入图片
img=cv2.imread('images4Exp2/lena.bmp')
#转换灰度
gimg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#sobel算子锐化
#对x方向梯度进行sobel边缘提取
x=cv2.Sobel(gimg,cv2.CV_64F,1,0)
#对y方向梯度进行sobel边缘提取
y=cv2.Sobel(gimg,cv2.CV_64F,0,1)
#对x方向转回uint8
absX=cv2.convertScaleAbs(x)
#对y方向转会uint8
absY=cv2.convertScaleAbs(y)
#x,y方向合成边缘检测结果
dst1=cv2.addWeighted(absX,0.5,absY,0.5,0)
#按要求左右显示原图与sobel处理结果
image=np.hstack([gimg,dst1])
cv2.imshow('sobelres',image)
#去缓存
cv2.waitKey(0)
cv2.destroyAllWindows()

四、实验结果记录

实验一 图像的二值化处理结果:

使用不同的type类型得到的结果也不一样,其中BINARY_INV阈值得到的图片效果最差,TOZERO归零阈值得到的图片效果最好。
BINARY阈值:230.0
BINARY_INV阈值:230.0
TRIANGLE自适应阈值:90.0
OTSU自适应阈值:130.0
TRUNC截断阈值:200.0
TOZERO归零阈值:100.0
在这里插入图片描述
在这里插入图片描述

实验二 分段线性变换结果:

经过分段线性变换后,处理后的图像比处理前的图像特征更明显。
在这里插入图片描述

实验三 均值滤波结果:

根据图像结果,随着模板的增大,图像越来越模糊,图像质量越来越差。
在这里插入图片描述
在这里插入图片描述

实验四 sobel锐化结果:

显示了原图和sobel锐化后的图。
在这里插入图片描述

五、附实验用图片下载

1.百度网盘下载链接:链接:https://pan.baidu.com/s/1WzkWNuOaldYeVCd5e40w2g
提取码:zb2t

下一篇:计算机视觉 实验三 特征检测

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值