OpenCV图像处理(一、核心操作)

OpenCV图像处理(一、核心操作)

灰度:使用黑色调表示物体,黑色为基准色,用不同的饱和度的黑色来显示图像。

  • 二值图像:只有黑和白两种颜色。0表示黑,255表示白;R/G/B = 0/255;
  • 灰度图像:在黑色与白色之间还有许多级的颜色深度;R=G=B;
  • 彩色图像:每个像素通常由RGB三个分量来表示。分别介于(0,155)

一、图像的基础操作

1. 获取图像并更改像素

1.1 读入图像

import cv2
img = cv2.imread("/Users/~/image.png, 1)

1.2 通过行或列的坐标获取像素值。

px = img[100, 100]
print(px)
blue = img[100, 100, 0]
print(blue)
#out
[111 108 97]
111

1.3 修改像素值

img[100, 100] = [255, 255, 255]
print(img[100, 100])
#out
[255, 255, 255]

1.4 获取像素及修改更好的方法

print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
#out
120 
100

2.获取图像的属性

获取图像的行、列、通道、数据类型、像素数目等

import cv2
img = cv2.imread("/Users/~/image.png, 0)

#行、列、通道
print(img.shape)
#out 
(848, 1534)#灰度图

#像素数目
print(img.size)
#out
1300832

#图像的数据类型
print(img.dtype)
#out
uint8

3.图像的ROI

有时需要对一副图像的特定区域进行操作。例:检测一副图像中的眼睛,我们应先找到脸,再从脸中找到眼睛;而不是直接去找眼睛

import cv2
img = cv2.imread("/Users/~/image.png, 0)
face = img[280:340, 330:390]
eye = img[273:333, 100:160]

4.拆分及合并图像通道

4.1 、拆分合并图像通道

import cv2
img = cv2.imread("/Users/~/image.png)
b, g, r = cv2.split(img)#比较耗时
img = cv2.merge((b, g, r))

4.2 指定渠道赋值

#取红色通道的值
r = img[:,:,0]#速度较快
#红色通道值赋0
img[:,:,0] = 0

5.为图像扩边(填充)

为图像加个边框:cv2.copyMakeBorder().
参数说明:

  • src:图像;
  • top,bottom,left,right:对应边界的像素数目;
  • borderType:添加的边界类型;
    • cv2.BORDER_CONSTANT:添加有颜色的常数边界,需要value;
    • cv2.BORDER_REFLECT:边界元素的镜像;
    • cv2.BORDER_REFLECT_101 or cv2.BOROER_DEFAULT :边界元素的镜像2;
    • cv2.BOROER_REPLICATE:重复最后一个元素。
    • cv2.BORDER_WARP:镜像3
  • value:边界颜色。
import cv2
import numpy as np
from matplotlib import pyplot as plt
blue = [255, 0, 0]
replicate = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(image1,10,10,10,10,cv2.BORDER_CONSTANT,value=blue)
plt.subplot(231),plt.imshow(image1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

OpenCV画图的颜色顺序是:BGR
matplotlib画图的顺序是:RGB

二、图像上的算术运算

1.图像加法

cv2.add():两幅图像的大小,类型必须一致,或者第二个图像可以是一个简单的标量值。

x = np.uint8([250])
y = np.unit8([10])
print(cv2.add(x, y))#250 + 10 = 260 >= 255
#out
[[255]]
print(x+y)# 250+10 = 260%255 = 4
#out
[4]

OpenCV效果会更好一些,尽量用OpenCV中的函数。

2.图像混合

cv2.addWeighted():其实也是加法,但是混合图像的权重不同,图像混合的计算公式如下:
g ( x ) = ( 1 a ) f 0 ( x ) + a f 1 ( x ) g(x) = (1-a)f_{0}(x)+af_{1}(x)
通过修改a的值,实现不同的混合。

import cv2
from matplotlib import pyplot as plt
img0 = cv2.imread("/Users/~~~/cat.jpg")
#合并的两幅图大小应一致,将cat的大小转换成logo的大小。
img1 = img0[100:596, 100:500]
cv2.imshow('cat', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(img1.shape)
img2 = cv2.imread("/Users/~~~/logo.jpg")
cv2.imshow('logo', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(img2.shape)
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('merge', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:
catcat cat

3. 按位运算

import cv2
import numpy as np
#加载图像
img1 = cv2.imread("/Users/~~~/cat.jpg")
img2 = cv2.imread("/Users/~~~/logo.jpg")
#将img2放在img1的左上角,所以创建roi
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
#创建图像的掩码和逆掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#img2gray中>175的值均变成255
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)
#按位非操作
mask_inv = cv2.bitwise_not(mask)
#取roi中于mask中不为零的值对应的像素的值,其他值为0
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
#取roi中于mask_inv中不为零的值对应的像素的值,其他值为0
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)

#put logo in ROI and modify the main image
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst

cv2.imshow('res', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/weixin_42902413/article/details/86648476
今日推荐