计算机视觉实验1

目录

1.使用OpenCV库读取图像并实现可视化

 · 图片处理:读入图像

·图片处理:显示图像 

2.使用PIL库读取图片,并可视化显示 

3.使用OpenCV与PIL读取图片的比较

 4.使用thumbnail()方法和resize()方法缩略图像

5. 绘制图像的轮廓与直方图

 6.绘制灰度直方图以及直方图均衡化

 7.实现图像的灰度变换

8.高斯模糊 

 9.图像求导


1.使用OpenCV库读取图像并实现可视化

下面是一段简单的计算机视觉相关代码,通过下面这段代码可以简单实现读取图片以及实现可视化

import cv2
img=cv2.imread('path')#path指图片相关路径
cv2.imshow('Demo',img)
cv2.nameWindow('Demo')
cv2.waitKey(0)
cv2.destroyAllWindows()

我在网上找了两端代码,一个是上面这个,一个是下面的 

import cv2
image = cv2.imread("images/book.png")  	# 读取book.png文件
cv2.imshow("book", image)  				# 在名为book的窗口中显示book.png
print(cv2.waitKey()) 		 			# 窗口将一直显示图像,按任意键关闭窗口,并输出按键值
cv2.destroyAllWindows()  				# 销毁所有窗口

两段代码的区别是下面的这个少了一个cv2.nameWindow('Demo'),当我运行上面这段代码的时候,会出现nameWindow的报错,但是把这一句删去就不会报错,(对了还要把waitkey里面的0删掉,不然会报错) 

 · 图片处理:读入图像

image=cv2.imread(文件名相关路径[显示控制参数])

文件名相关路径就填写图片的完整路径,其中的控制参数包括:

cv.IMREAD_UNCHANGED :表示和原图像一致
cv.IMREAD_GRAYSCALE : 表示将原图像转化为灰色图像
cv.IMREAD_COLOR:表示将原图像转化为彩色图像

例:cv2.imread(‘d:\image.jpg’,cv.IMREAD_UNCHANGED)

·图片处理:显示图像 

None=cv2.imshow(窗口名,图像名)

例:cv2.imshow("demo",image)

但是还需要加上相关约束,否则显示的图像就会一闪而过,发生错误:

retval=cv2.waitKey([delay])

反正我是在这里直接为空

最后还需要显示cv2.destroyAllWindows()

把图像彻底从内存中删除

最终两端代码的运行:

import cv2
img=cv2.imread('D:/PycharmProjects/pythonProject/blackpink7.jpg')#path指图片相关路径
cv2.imshow('Demo',img)

cv2.waitKey()
cv2.destroyAllWindows()

 


import cv2
image = cv2.imread("D:/PycharmProjects/pythonProject/blackpink7.jpg")  	# 读取book.png文件
cv2.imshow("idol", image)  				# 在名为idol的窗口中显示blackpink7.jpg
print(cv2.waitKey()) 		 			# 窗口将一直显示图像,按任意键关闭窗口,并输出按键值
cv2.destroyAllWindows()  				# 销毁所有窗口

2.使用PIL库读取图片,并可视化显示 

from PIL import Image

im = Image.open('D:/PycharmProjects/pythonProject/blackpink7.jpg')
print(im.format, im.size, im.mode)
im.save('1-PIL.bmp')

这个可视化显示没有实现吧(应该?),它最后自己保存了一个1-PIL.bmp文件

啊哈解决了!加入一句im.show()就可以显示啦!

import matplotlib.pyplot as plt
from PIL import Image

im = Image.open('D:/PycharmProjects/pythonProject/blackpink7.jpg')
im.show()
print(im.format, im.size, im.mode)
im.save('1-PIL.bmp')

 

3.使用OpenCV与PIL读取图片的比较

 ·使用OpenCV

·使用PIL 

 区别:

1.opencv的图片用shape,会返回三个值,分别是高,宽,通道数

2.PIL的图片用size,返回两个值,分别是宽,高

3.PIL和opencv返回的值中宽高顺序是不一样的,Opencv先高再宽,PIL先宽再高

4.opencv的读图的通道顺序是BGR,PIL的读图顺序是RGB

 4.使用thumbnail()方法和resize()方法缩略图像

import matplotlib.pyplot as plt
from PIL import Image

im = Image.open('D:/PycharmProjects/pythonProject/blackpink7.jpg')
im.show()

im.save('1-PIL.bmp')

print(im.mode) # 查看图片通道数
print('原图像',im.size) # 图片宽×高
print(im.size[0]) # 图片宽
print(im.size[1]) # 图片高
im.resize((128,128))

reim=im.resize((128,128))
print("resize后的图像reim大小为:",reim.size)

im.thumbnail((128,128))
print("thumbnail后的图像im大小为:",im.size)

 

 区别:

1.resize()方法可以缩小也可以放大,而thumbnail()方法只能缩小;

2.resize()方法不会改变对象的大小,只会返回一个新的Image对象,而thumbnail()方法会直接改变对象的大小,返回值为none;

3.resize()方法中的size参数直接规定了修改后的大小,而thumbnail()方法按比例缩小,size参数只规定修改后size的最大值

5. 绘制图像的轮廓与直方图

绘制前景图像对应的实心轮廓,将实心轮廓与原始图像按位与操作,即可将前景图像从原始图像中提取出来

image=cv2.drawContours (image,contours,contourldx,color[,thickness[,lineType[,hierarchy[,maxLevel[,offset]]]]])
 

参数:

contours:需要绘制的轮廓

contourldx:边缘索引。参数为整数或者为0,表示绘制对应索引号的轮廓,值为负数-1,表示绘制全部轮廓

color: 绘制的颜色

thickness: 绘制轮廓时所用的画笔粗细。默认为-1,表示绘制实心轮廓

lineType: 绘制轮廓的线型

hierarchy: 对应查找函数输出的层次信息

maxLevel: 控制所绘制的轮廓层次的深度,为0则表示第0层的轮廓,为其他的非零正数则表示绘制最高层及以下的相同数量层级的轮廓

offset:偏移参数,使轮廓偏移到不同的位置展示出来
                                              

import cv2
import numpy as np

img=cv2.imread('D:/PycharmProjects/pythonProject/blackpink7.jpg')#path指图片相关路径
cv2.imshow('Demo',img)

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#图像从BGR转为灰度
ret,binary = cv2.threshold(gray,127,255, cv2.THRESH_BINARY)     #阈值处理为二值图像
contours,hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)   #查找图像轮廓
mask=np.zeros (img.shape,np.uint8)
mask=cv2.drawContours(mask, contours,-1,(255,255,255),-1)   #绘制图像轮廓
cv2.imshow ("mask",mask)
loc=cv2.bitwise_and(img, mask)    #按位与得到提取的原图像的前景图像
cv2.imshow ("location",loc)




cv2.waitKey()
cv2.destroyAllWindows()

print(img.shape)  # 查看图片信息
# (714,1069,3),高×宽×通道数,注意是高×宽
print('图片高',img.shape[0])  # 图片高
print('图片宽',img.shape[1])  # 图片宽
print('图片通道数',img.shape[2])  # 图片通道数

 

 

 6.绘制灰度直方图以及直方图均衡化


import cv2
import matplotlib

# 在服务端调试不显示
matplotlib.use('Agg')

import matplotlib.pyplot as plt
import numpy as np


# 计算灰度图的直方图
def calchist_for_gray(imgname):
    img = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)
    hist = cv2.calcHist([img], [0], None, [256], [0, 255])
    plt.plot(hist, color="r")
    plt.savefig("result_gray.jpg")


# 计算彩色图的直方图
def calchist_for_rgb(imgname):
    img = cv2.imread(imgname)
    histb = cv2.calcHist([img], [0], None, [256], [0, 255])
    histg = cv2.calcHist([img], [1], None, [256], [0, 255])
    histr = cv2.calcHist([img], [2], None, [256], [0, 255])

    plt.plot(histb, color="b")
    plt.plot(histg, color="g")
    plt.plot(histr, color="r")
    plt.savefig("result_rgba.jpg")


# 计算掩码的直方图
def calchist_for_mask(imgname):
    img = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)

    mask = np.zeros(img.shape, np.uint8)
    mask[200:400, 200:400] = 255

    histMI = cv2.calcHist([img], [0], mask, [256], [0, 255])
    histImage = cv2.calcHist([img], [0], None, [256], [0, 255])

    plt.plot(histMI, color="r")
    plt.savefig("result_mask.jpg")
    # plt.show()


def get_mask(imgname):
    image = cv2.imread(imgname, 0)
    mask = np.zeros(image.shape, np.uint8)
    mask[200:400, 200:400] = 255
    mi = cv2.bitwise_and(image, mask)
    cv2.imwrite("mi.jpg", mi)


def get_equalizehist_img(imgname):
    img = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)
    equ = cv2.equalizeHist(img)

    plt.subplot(221)
    plt.imshow(img, plt.cm.gray)
    plt.axis('off')

    plt.subplot(222)
    plt.hist(img.ravel(), 256)

    plt.subplot(223)
    plt.imshow(equ, plt.cm.gray)
    plt.axis('off')

    plt.subplot(224)
    plt.hist(equ.ravel(), 256)
    plt.savefig("result2.jpg")


if __name__ == "__main__":
    test_img = "D:/PycharmProjects/pythonProject/blackpink7.jpg"
    # calchist_for_rgb(test_img)
    calchist_for_gray(test_img)
    # calchist_for_mask(test_img)
    # get_mask(test_img)
    # get_equalizehist_img(test_img)

 7.实现图像的灰度变换

伽马变换是用来图像增强,提升了暗部细节,通过非线性变换,让图像从曝光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。

伽马值小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分

伽马值大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分

import cv2
import copy
# 读入原始图像
img = cv2.imread('D:/PycharmProjects/pythonProject/blackpink7.jpg', 1)

# 灰度化处理
img1 = cv2.imread('D:/PycharmProjects/pythonProject/blackpink7.jpg', 0)

# 灰度化处理:此灰度化处理用于图像二值化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 伽马变换
gamma = copy.deepcopy(gray)
rows = img.shape[0]
cols = img.shape[1]
for i in range(rows):
    for j in range(cols):
        gamma[i][j] = 3 * pow(gamma[i][j], 0.8)

# 通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
cv2.imshow('img', img)
cv2.imshow('gray', img1)
cv2.imshow('gamma', gamma)

# 暂停cv2模块 不然图片窗口一瞬间即就会消失 观察不到
cv2.waitKey(0)

 

8.高斯模糊 


#高斯模糊
# 加载图像 利用循环遍历加载高斯噪声 利用API去除高斯噪声  
import cv2 as cv
import numpy as np


# 加载图像
def load_image():
    src = cv.imread('D:/PycharmProjects/pythonProject/blackpink7.jpg')
    return src


# 处理超限
def clip(num):
    if num > 255:
        return 255
    elif num < 0:
        return 0
    else:
        return num


# 放置高斯噪声
def gaussian_image(image):
    h, w, ch = image.shape
    for i in range(h):
        for j in range(w):
            # 随机矩阵 1*3
            s = np.random.normal(0, 20, 3)
            image[i, j, 0] = clip(image[i, j, 0] + s[0])  # blue
            image[i, j, 1] = clip(image[i, j, 1] + s[1])  # green
            image[i, j, 2] = clip(image[i, j, 2] + s[2])  # red
    return image


# 利用API去噪
def clear_noise(image):
    dst = cv.GaussianBlur(image, (3, 3), 2, 2)
    return dst


# 展示
def show_and_time():
    src = load_image()
    cv.imshow('image', src)
    t_1 = cv.getTickCount()
    noise = gaussian_image(src)
    cv.imshow('noise', noise)
    dst = clear_noise(noise)
    cv.imshow('dst', dst)
    t_2 = cv.getTickCount()
    print('time {0:.2f} ms'.format((t_2 - t_1) / cv.getTickFrequency() * 1000))
    cv.waitKey(0)
    cv.destroyAllWindows()


show_and_time()

 

 

 高斯模糊参考:(27条消息) python-OpenCV:模糊操作,高斯模糊,原理及其代码解析。_python opencv 高斯模糊_才疏学浅的莫笑天的博客-CSDN博客

 9.图像求导

通过对灰度图像进行任意方向的求导都可以让图像强度发生变化,

图像的梯度向量用来描述图像强度变化的强弱,

 

梯度的角度描述了图像中在每个像素上强度变化最大的方向。

 

 

from PIL import Image
from pylab import *
import numpy as np
import matplotlib.pyplot as plt
#导入sobel算子
from scipy.ndimage import sobel
#设中文,读灰度图
plt.rcParams['font.sans-serif'] = ['SimHei']
im = array(Image.open('D:/PycharmProjects/pythonProject/blackpink7.jpg').convert('L'))
gray()
subplot(141)
axis('off')
title(u'(a)原图')
imshow(im)
#sobel算子
imx = zeros(im.shape)
sobel(im,1,imx)
subplot(142)
axis('off')
title(u'(b)x方向差分')
imshow(imx)
imy = zeros(im.shape)
sobel(im,0,imy)
subplot(143)
axis('off')
title(u'(c)y方向差分')
imshow(imy)
#求梯度向量
mag = 255-np.sqrt(imx ** 2 + imy ** 2)
subplot(144)
title(u'(d)y梯度幅值')
axis('off')
imshow(mag)
show()

 参考:(27条消息) 计算机视觉(三):基于Scipy图像处理技术,图像模糊(灰色、彩色图像高斯模糊)、图像导数(sobel算子滤波)_天海一直在的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值