[图像处理]——基本操作(OpenCV)

一、图片的IO操作

1、读取图片

读取图片使用 cv.imread(图片路径,读取方式)

参数:使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,或者给函数提供一个完整的路径,第二个参数是要告诉函数应该如何读取这幅图片。

  • cv2.IMREAD_COLOR:加载彩色图像,图像的任何透明度都会被忽略,是该方法的默认方式。
  • cv2.IMREAD_GRAYSCALE :以灰度模式加载图像。
  • cv2.IMREAD_UNCHANGED : 以包含Alpha通道的方式加载图像。

注意:这三个标志位,可以直接使用10-1来分别表示

# -*- coding: utf-8 -*- 
import numpy as np 
import cv2 

#加载一副灰色图片 
img = cv2.imread('love.jpg', 0) #0或者cv2.IMREAD_GRAYSCALE

注意:加载的路径有错误,不会报错,会返回一个None值

2、显示图像

(1)opencv方式显示

使用函数 cv.imshow() 显示图像。窗口会自动调整为图像大小。第一个参数是图像窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字。

相关函数介绍:

  • cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否被按下
  • cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果你想删除特定的窗口可以使cv2.destroyWindow(),在括号内输入你想删除的窗口名。
import numpy as np
import cv2

def fun():
    img = cv2.imread('./images/han_gyy.jpg', 1)
    cv2.imshow('image', img)
    cv2.waitKey(0)  #如果没有这行代码,图像窗口则会无响应
    cv2.destroyAllWindows()

if __name__ == '__main__':
    fun()

(2)matplotlib方式显示

Matplotlib 是一个 Python 的一个绘图库,它给使用者提供了各种各样的绘图方法(函数)。Matplotlib 能够缩放图像,保存图像等。

  • 注:通过 OpenCv 加载彩色图像时是使用的 BGR 模式。但是Matplotlib 显示图像使用的 RGB 模式。 所以如果图像是OpenCv 读取的, 那么彩色图像使用Matplotlib不会正确的显示
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./images/gyy.jpg', 0)
plt.imshow(img, cmap='gray', interpolation='bicubic')
plt.xticks([]), plt.yticks([]) #在x轴、y轴上隐藏刻度值
plt.show()

(3)简单案例

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread("./images/gyy.jpg", cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#将窗口分为两行两列四个子图,则可显示四幅图

#第一幅图
plt.subplot(2, 2, 1)
plt.title("origin image") #标题
plt.imshow(img)

#第二幅图
plt.subplot(2, 2, 2)
plt.title("R channel") #标题
plt.imshow(img[:, :, 0], plt.cm.gray)
plt.axis('off')

#第三幅图
plt.subplot(2, 2, 3)
plt.title("G channel") #标题
plt.imshow(img[:, :, 1], plt.cm.gray)
plt.axis('off')

#第四幅图
plt.subplot(2, 2, 4)
plt.title("B channel") #标题
plt.imshow(img[:, :, 2], plt.cm.gray)
plt.axis('off')

plt.show() #显示窗口

二、图像上绘制图形

1、图形绘制API

图形API参数说明
绘制直线cv.line(img, start, end, color, tickness)start, end:直线的起点和终点
绘制圆形cv.circle(img, centerpoint, r, color, thickness)centerpoint,r:圆心和半径
绘制矩形cv.rectangle(img, leftupper, rightdown, color, thickness)leftupper,rightdown:矩形的左上角和右下角的坐标
添加文字cv.outText(img, text, station, font, fontSize, color, thickness, cv.LINE_AA)text:要写入的文本数据;station:文本放置位置;

公共参数:

  • img :想绘制出的那副图像
  • color:形状的颜色。以 RGB 为例,需要传入一个元组,例如( 255 0 0 )代表蓝色。对于灰度图只需传入灰度值。
  •  
    thickness :线条的粗细。如果一个闭合图形设置为 -1 ,那么这个图形就会被填充。默认值为 1.
  • linetype:线条的类型,是否8 连接,反锯齿线。默认情况下,它是 8 连接。 cv2.LINE_AA 提供了抗锯齿线条,看起来很适合画曲线。

2、简单案例

img[:,:,::-1] —— 》 表示所有行,所有列,::-1为t通道翻转

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

#创建一个空白的图像
img = np.zeros((512, 512, 3), np.uint8)

#绘制图形
cv.line(img, (0,0), (512, 300), (255,0,0), 5)
cv.rectangle(img, (332,0), (512, 180), (100, 240, 0), 3)
cv.circle(img, (422, 100), 100, (0, 0, 255), -1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 450), font, 4, (255,255,255), 2, cv.LINE_AA)

#图像展示
plt.imshow(img[:, :, ::-1])
plt.title("result:"), plt.xticks([]), plt.yticks([])
plt.show()

三、其余操作

1、获取并修改图像中的像素点

通过行和列的坐标值获取该像素点的像素值。对于BRG图像,它可以返回一个蓝、绿、红值的数组,对于灰度图像,仅返回相应的强度值,使用相同的方法对像素值修改。

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

#绘制简单图像
img = np.zeros((512, 512, 3), np.uint8)

#获取某点像素点值
print(img[100, 100])

#仅获取蓝色通道的强度值
blue = img[100, 100, 0]
print(blue)

#修改某个位置的像素值、
img[100, 100] = [255, 255, 255]

#显示图像
plt.imshow(img[:, :, ::-1])
plt.show()

2、获取图像的属性

像素个数计算:行数 * 列数 * 通道数

3、图像通道的拆分与合并

有时需要在B、G、R通道图像上单独工作,在这种情况下,需要将BGR图像分割为单个通道,或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。

  • 图像拆分: b, g, r = cv.split(img)
  • 通道合并:cv.merge(b, g, r)
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

#获取图像
img = cv.imread("./images/gyy.jpg")

#通道拆分
b, g, r = cv.split(img)

#用b通道以灰度图的方式展示
plt.imshow(b, cmap=plt.cm.gray)
plt.show()

4、色彩空间的改变

OpenCV中有150多种颜色空间的转换方法。最广泛使用的转换方法有两种,即:BGR与Gray的转换  及  BGR与HSV的转换

API:cv.cvtColor(input_img, flag)

参数:

  • input_img:进行颜色空间转换的图像
  • flag转换类型
    • cv.COLOR_BGR2GRAY        BGR——>GRAY
    • cv.COLOR_BGR2HSV           BGR——>HSV           

(1)将图像转换成灰度图像

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

#获取图像
img = cv.imread("./images/gyy.jpg")

#图像色彩空间的转换
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

#展示图像
plt.imshow(gray, cmap=plt.cm.gray)
plt.show()

 

 (2)将图像转换为HSV格式

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

#获取图像
img = cv.imread("./images/gyy.jpg")

#图像色彩空间的转换
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

#展示图像
plt.imshow(hsv[:, :, ::-1])
plt.show()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Star星屹程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值