计算机视觉(一)——图像处理基本操作

1读图、展示和保存

        话不多述,直接上代码:

import cv2 as cv
image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
cv.imshow('Image', image)
cv.waitKey(0)
# waitKey()函数的功能是刷新图像,其中参数k单位是毫秒,表示刷新频率。waitKey(0)表示不刷新无限等待
cv.imwrite("new_image.jpg", image)

                         计算机视觉(一)——图像处理基本操作_第1张图片

2 提取图像的宽度、高度、通道数及局部图像和特征

# shape[0]表示提取图像的宽度,shape[1]表示提取图像的高度,shape[2]表示提取图像的通道数
weight = image.shape[0]
height = image.shape[1]
channels = image.shape[2]
print(height)
print(weight)
print(channels)
# 输出坐标为[10, 10]处的像素值
print(image[10, 10])
# 获取局部图像
patch1 = image[300:500, 300:400]
cv.imshow("patch1", patch1)
cv.waitKey(0)

                              计算机视觉(一)——图像处理基本操作_第2张图片

3 图像旋转

"""
    图像旋转:
    (1)获取图像的宽度、高度以及中心点
    (2)创建旋转矩阵
    (3)getRotationMatrix2D()有三个参数,一个旋转中心,一个是旋转角度,一个是图片缩放尺度1表示保持原图大小
"""
(w, h) = image.shape[:2]
center = (w//2, h/2)
# print(h)
# print(w)
# print(center)
M = cv.getRotationMatrix2D(center, 135, 1.0)
# warpAffine仿射变换,其实就是不同的坐标系的相互转换,用于图像的平移和旋转.
rotated_image = cv.warpAffine(image, M, (w, h))
cv.imshow('rotated_image', rotated_image)
cv.waitKey(0)

                                    计算机视觉(一)——图像处理基本操作_第3张图片

4 图像缩放

"""
    图像的缩放,缩放需要进行插值,插值方法很多,这里选择了INTER_AREA进行插值
"""
new_w, new_h = 100, 200
resized_image = cv.resize(image, (new_w, new_h), interpolation=cv.INTER_AREA)
cv.imshow('resized_image', resized_image)
cv.waitKey(0)

                       计算机视觉(一)——图像处理基本操作_第4张图片

5图像的位运算-交集并集异或取非操作

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

plt.figure()
plt.subplots(321)
rectangle = np.zeros((100, 100), dtype='uint8')
cv.rectangle(rectangle, (30, 30), (70, 70), 255, -1)
cv.imshow("Rectangle", rectangle)
cv.waitKey(0) # 必须需要指定,不然就会一闪而过

plt.subplots(322)
circle = np.zeros((100, 100), dtype='uint8')
cv.circle(circle, (50, 50), 25, 255, -1)
cv.imshow("Circle", circle)
cv.waitKey(0)

# 交集
bitwiseAnd = cv.bitwise_and(rectangle, circle)
cv.imshow("AND", bitwiseAnd)
cv.waitKey(0)

"""
并集 bitwise_or 
异或操作:bitwise_xor
取非操作:bitwise_not
"""

                          计算机视觉(一)——图像处理基本操作_第5张图片计算机视觉(一)——图像处理基本操作_第6张图片计算机视觉(一)——图像处理基本操作_第7张图片

6. 图像通道分离与融合

          如果你想分类彩色图像的不同通道与融合,分离使用split,融合使用merge

import cv2 as cv

image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
(B, G, R) = cv.split(image)
merged = cv.merge([B, G, R])
print([R, G, B])

cv.imshow("Red", R)
cv.imshow("Green", G)
cv.imshow("Blue", B)
cv.imshow("Merged", merged)
cv.waitKey(0)

               计算机视觉(一)——图像处理基本操作_第8张图片计算机视觉(一)——图像处理基本操作_第9张图片

                计算机视觉(一)——图像处理基本操作_第10张图片计算机视觉(一)——图像处理基本操作_第11张图片

7.Masking感兴趣区域提取

         在做项目的过程中,我们常常需要提取一些感兴趣的区域,例如对于人脸识别,我们只需要提取人脸即可,而对于一些其他的区域都是无用区域,因此我们就可以只提取我们感兴趣的区域即可。感兴趣的区域提取利用从cv2.bitwise_and(image. image, mask=mask),前两个参数为原图(也可以不同但是尺寸必须一样),第三个为mask,通过他bitwise_and只关注mask中被打开的区域。

import cv2 as cv
import numpy as np

# 不能含有中文路径
test_image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
cv.imshow("test_image", test_image)
cv.waitKey(0)
image_shape = test_image.shape[:2]
print(image_shape)
mask = np.zeros(image_shape, dtype='uint8')
# print(mask)
(cx, cy) = (image_shape[1]//2, image_shape[0]//2)
cv.rectangle(mask, (cx-75, cy-75), (cx+75, cy+75), 255, -1)
cv.imshow("Mask", mask)
cv.waitKey(0)
masked = cv.bitwise_and(test_image, test_image, mask=mask)
cv.imshow("Mask Applied to image", masked)
cv.waitKey(0)

                       计算机视觉(一)——图像处理基本操作_第12张图片

8. 颜色空间转换

         颜色空间,主要有RGB,HSV,L*a*b,HSV空间表达比RGB表达更加接近人类对于色彩的认知,而L*a*b更胜一筹。

         颜色空间转换主要使用cv2.cvtColor函数,第一个参数是需要-颜色转换的图像,第二个参数是颜色空间转换格式,常用有cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV等

import cv2 as cv
image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
cv.imshow("Original", image)

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("Gray", gray)

hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
cv.imshow("HSV", hsv)

lab = cv.cvtColor(image, cv.COLOR_BGR2LAB)
cv.imshow("LAB", lab)
cv.waitKey(0)

                计算机视觉(一)——图像处理基本操作_第13张图片计算机视觉(一)——图像处理基本操作_第14张图片计算机视觉(一)——图像处理基本操作_第15张图片计算机视觉(一)——图像处理基本操作_第16张图片

9. 颜色直方图

         简单的说就是图片中像素点的分布,通过统计,可以直观的用曲线表达出那些像素值多哪些少。在RGB空间主要将值域分为4个区间,每个区间代表一个64px,即[0,64), [64,128),[128,192),[192,255]4个区间,然后统计图片中所有像素落在这个4个区间的像素点个数,最后作图展示出来。

        Opencv使用cv2.calcHist方式来计算直方图,参数有images、channels、mask、hitSize、ranges。其中图像列表[images]、通道索引channels,比如灰度图为[0],彩色图用[0,1,2];mask参数如果提供,则只计算mask大于0的区域,不实用则传None即可;hitSize针对所统计通道设置区间数,如三通道[8,8,8];ranges为像素点值域,对于RGB为[0,256]

import cv2 as cv
from matplotlib import pyplot as plt

image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
# 颜色空间转换
gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("gray_image", gray_image)
# 颜色直方图统计
plt.figure()
hist = cv.calcHist([gray_image], [0], None, [256], [0, 256])
plt.subplot(221)
plt.plot(hist)
plt.title("Grayscale color histogram")

# 色彩通道分离
B, G, R = cv.split(image)
hist_B = cv.calcHist([B], [0], None, [256], [0, 256])
plt.subplot(222)
plt.plot(hist_B, 'b')
plt.title("B-channel color histogram")

hist_G = cv.calcHist([G], [0], None, [256], [0, 256])
plt.subplot(223)
plt.plot(hist_G, 'g')
plt.title("G-channel color histogram")

hist_R = cv.calcHist([R], [0], None, [256], [0, 256])
plt.subplot(224)
plt.plot(hist_R, 'r')
plt.title("R-channel color histogram")

plt.show()
cv.waitKey(0)

    计算机视觉(一)——图像处理基本操作_第17张图片计算机视觉(一)——图像处理基本操作_第18张图片

                                  原图                                                                                     灰度图

      计算机视觉(一)——图像处理基本操作_第19张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(计算机视觉-图像处理,边缘计算,视觉检测)