图像的基础操作

一. 获取并修改像素值

import cv2
import numpy as np
img = cv2.imread("E://dog.jpg")
#根据像素的行和列的坐标获取他的像素值。对 BGR 图像而言,返回值为 B, G, R 的值。对灰度图像而言,会返回他的灰度值
print(img[100,100])      #[ 60 114 125]
print(img.item(100,100,2))   #125
img.itemset((100,100,2),25)
print(img.item(100,100,2))   #25

二. 获取图像属性

1.. img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数,通道数的元组。

img = cv2.imread("E://dog.jpg")
print(img.shape)     #(640, 640, 3)

如果图像是灰度图,返回值仅有行数和列数。所以通过检查这个返回值就可以知道加载的是灰度图还是彩色图。
2.. img.size 可以返回图像的像素数目。

print(img.size)    #1228800

3.. img.dtype 返回的是图像的数据类型。

print(img.dtype)   #uint8

三. 图像ROI

ROI(Region of Interest)是指图像中的一个矩形区域,可能你后续的程序需要单独处理这一个小区域。如果你对图像设置了ROI,那么,opencv的大多数函数只在该ROI区域内运算(只处理该ROI区域),如果没设ROI的话,就会出来整幅图像。

import cv2
import numpy as np
img = cv2.imread("E://dog.jpg")

ballImg = img[380:520,230:350]   #利用numpy中的数组切片设置ROI区域
img[0:140,0:120] = ballImg       #将设置的ROI区域添加到原图像的左上方

cv2.namedWindow("Image")
cv2.imshow("Image", img)
cv2.waitKey(0)

这里写图片描述

四. 拆分及合并图像通道

有时我们需要对 BGR 三个通道分别进行操作。这是你就需要把 BGR 拆分成单个通道。
1..第一种方法:使用OpenCV自带的split 函数

import cv2
import numpy as np
img = cv2.imread("E://dog.jpg")
b,g,r = cv2.split(img)
cv2.imshow("blue", b)
cv2.imshow("green", g)
cv2.imshow("red", r)
cv2.waitKey(0)

这里写图片描述

2..第二种方法:使用Numpy数组来分离通道

import cv2
import numpy as np
img = cv2.imread("E://dog.jpg")
# 创建3个跟图像一样大小的矩阵,数值全部为0
b = np.zeros((img.shape[0],img.shape[1]),dtype=img.dtype)
g = np.zeros((img.shape[0],img.shape[1]),dtype=img.dtype)
r = np.zeros((img.shape[0],img.shape[1]),dtype=img.dtype)
#复制图像通道里的数据 
b[:,:] = img[:,:,0]
g[:,:] = img[:,:,1]
r[:,:] = img[:,:,2]

cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用Numpy 索引就尽量用。

有时你需要把独立通道的图片合并成一个 BGR 图像。

img = cv2.merge([r,g,b])  #将BGR图像以RGB的顺序显示

这里写图片描述

五. 绘图函数

1) 画线
cv2.line(img,pt1,pt2,color,thickness)
img:你想要绘制图形的那幅图像。
pt1,pt2:线段的起点和终点
color:线条的颜色。以 RGB 为例,需要传入一个元组,例如:(255,0,0)代表蓝色。对于灰度图只需要传入灰度值。
thickness:线条的粗细。如果给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1.
2) 画矩形
cv2.rectangle(img,pt1,pt2,color,thickness)
pt1,pt2分别表示矩形的左上端点和右下端点
3) 画圆
cv2.circle(img,center,radius,color)
4) 添加文字
cv2.putText(img,str,ptr,fontFace,fontScale,color)
fontFace,fontScale分别为字体的类型和大小,类型可查阅字体集

import cv2
import numpy as np
img = np.zeros((512,512,3), np.uint8)

cv2.line(img,(0,0),(512,300),(255,0,0),5)  #直线
cv2.line(img,(512,0),(0,300),(255,0,0),5)  #直线
cv2.rectangle(img,(0,0),(512,300),(0,0,255),5)  #矩形
cv2.circle(img,(256,150),80,(0,255,0))  #圆
font = cv2.FONT_HERSHEY_COMPLEX
cv2.putText(img,'Opencv',(10,400),font,4,(50,50,50)) #文字

cv2.imshow('img',img)    
cv2.waitKey(0)

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值