An open API service indexing awesome lists of open source software.

https://github.com/hakaboom/base_image

对opencv_python常用接口的二次开发
https://github.com/hakaboom/base_image

Last synced: 4 months ago
JSON representation

对opencv_python常用接口的二次开发

Awesome Lists containing this project

README

          

# base_image
对opencv_python常用接口的二次开发

建议 opencv version >= 4.5.5(不同opencv版本的python绑定,函数名可能会不同)

# Example

## Create
1. 默认方式创建图片对象
```python
import cv2
from baseImage import Image
from baseImage.constant import Place

Image(data='tests/image/0.png') # 使用默认方式创建
```

2. 通过其他参数,调整图片参数

- 使用place参数,修改数据格式
- Ndarray: 格式为numpy.ndarray格式
- Umat: python的绑定不多,没有ndarray灵活,可以用于opencl加速
- GpuMat: opencv的cuda格式,需要注意显存消耗
- 可以通过常量`Default_Pool`设定缓冲区

```python
import cv2
from baseImage import Setting

cv2.cuda.setBufferPoolUsage(True)
cv2.cuda.setBufferPoolConfig(cv2.cuda.getDevice(), 1024 * 1024 * (3 + 3), 1)

stream = cv2.cuda.Stream()
pool = cv2.cuda.BufferPool(stream)

Setting.Default_Stream = stream
Setting.Default_Pool = pool
```

```python
import cv2
from baseImage import Image
from baseImage.constant import Place

Image(data='tests/image/0.png', place=Place.Ndarray) # 使用numpy
Image(data='tests/image/0.png', place=Place.UMat) # 使用Umat
Image(data='tests/image/0.png', place=Place.GpuMat) # 使用cuda
```

- 使用dtype,修改数据类型
```python
import cv2
import numpy as np
from baseImage.utils.api import cvType_to_npType, npType_to_cvType
from baseImage import Image

Image(data='tests/image/0.png', dtype=np.uint8)
Image(data='tests/image/0.png', dtype=np.int8)
Image(data='tests/image/0.png', dtype=np.uint16)
Image(data='tests/image/0.png', dtype=np.int16)
Image(data='tests/image/0.png', dtype=np.int32)
Image(data='tests/image/0.png', dtype=np.float32)
Image(data='tests/image/0.png', dtype=np.float64)
# cvType_to_npType和npType_to_cvType提供了numpy转opencv数据格式的方法, cv的数据格式意义自行百度
```

- clone,用于处理是否拷贝原数据
```python
import cv2
import numpy as np
from baseImage import Image, Rect

img1 = Image(data='tests/image/0.png')
img2 = Image(img1, clone=False)
img2.rectangle(rect=Rect(0, 0, 200, 200), color=(255, 0, 0), thickness=-1)
img2.imshow('img2')
img1.imshow('img1')
cv2.waitKey(0)
```

## property
1. shape: 获取图片的长、宽、通道数
```python
from baseImage import Image

img = Image(data='tests/image/0.png')
print(img.shape)
# expect output
# (1037, 1920, 3)
```
2. size: 获取图片的长、宽
```python
from baseImage import Image

img = Image(data='tests/image/0.png')
print(img.size)
# expect output
# (1037, 1920)
```
3. channels: 获取图片的通道数量
```python
from baseImage import Image

img = Image(data='tests/image/0.png')
print(img.channels)
# expect output
# 3
```
4. dtype: 获取图片的数据类型
```python
from baseImage import Image

img = Image(data='tests/image/0.png')
print(img.dtype)
# expect output
# numpy.uint8
```
5. place: 获取图片的数据格式
```python
from baseImage import Image
from baseImage.constant import Place

img = Image(data='tests/image/0.png', place=Place.Ndarray)
print(img.place == Place.Ndarray)
# expect output
# True
```
6. data: 获取图片数据
```python
from baseImage import Image

img = Image(data='tests/image/0.png')
print(img.data)
```

## Function
1. dtype_convert: 数据类型转换
- 将修改原图像数据
```python
from baseImage import Image
import numpy as np

img = Image(data='tests/image/0.png', dtype=np.uint8)
print(img.dtype)
img.dtype_convert(dtype=np.float32)
print(img.dtype)
```
2. place_convert: 数据格式转换
- 将修改原图像数据
```python
from baseImage import Image
from baseImage.constant import Place

img = Image(data='tests/image/0.png', place=Place.Ndarray)
print(img.place == Place.Ndarray)
img.place_convert(place=Place.UMat)
print(img.place == Place.Ndarray)
print(img.place == Place.UMat)
```

3. clone: 克隆一个新的图片对象
```python
from baseImage import Image
from baseImage.constant import Place

img = Image(data='tests/image/0.png', place=Place.Ndarray)
img2 = img.clone()
print(img == img2)
```

4. rotate: 旋转图片, 现在只支持opencv自带的三个方向
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png')
img.rotate(code=cv2.ROTATE_180).imshow('180')
img.rotate(code=cv2.ROTATE_90_CLOCKWISE).imshow('90_CLOCKWISE')
img.rotate(code=cv2.ROTATE_90_COUNTERCLOCKWISE).imshow('90_COUNTERCLOCKWISE')
cv2.waitKey(0)
```

5. resize: 缩放图像
```python
from baseImage import Image

img = Image(data='tests/image/0.png')
new_img = img.resize(200, 200)
print(new_img.size)
```

6. cvtColor: 转换图片颜色空间
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png')
new_img = img.cvtColor(cv2.COLOR_BGR2GRAY)
new_img.imshow()
cv2.waitKey(0)
```

7. crop: 裁剪图片
```python
from baseImage import Image, Rect
import cv2

img = Image(data='tests/image/0.png')
new_img = img.crop(rect=Rect(0, 0, 400, 400))
new_img.imshow()
cv2.waitKey(0)
```

8. threshold: 二值化图片
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png')
new_img = img.threshold(thresh=0, maxval=255, code=cv2.THRESH_OTSU)
new_img.imshow()
cv2.waitKey(0)
```

9. rectangle: 在图像上画出矩形
- 会在原图上进行修改
```python
from baseImage import Image, Rect
import cv2

img = Image(data='tests/image/0.png')
img.rectangle(rect=Rect(100, 100, 300, 300), color=(255, 0, 0), thickness=-1)
img.imshow()
cv2.waitKey(0)
```

10. copyMakeBorder: 扩充图片边缘
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png')
new_img = img.copyMakeBorder(top=10, bottom=10, left=10, right=10, borderType=cv2.BORDER_REPLICATE)
new_img.imshow()
cv2.waitKey(0)
```

11. gaussianBlur: 高斯模糊
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png')
new_img = img.gaussianBlur(size=(11, 11), sigma=1.5, borderType=cv2.BORDER_DEFAULT)
new_img.imshow()
cv2.waitKey(0)
```

12. warpPerspective: 透视变换
```python
from baseImage import Image, Size
import cv2
import numpy as np

img = Image(data='tests/image/0.png')
point_1 = np.float32([[0, 0], [100, 0], [0, 200], [100, 200]])
point_2 = np.float32([[0, 0], [50, 0], [0, 100], [50, 100]])
matrix = cv2.getPerspectiveTransform(point_1, point_2)
size = Size(50, 100)

new_img = img.warpPerspective(matrix, size=size)
new_img.imshow()
cv2.waitKey(0)
```
13. bitwise_not: 反转图片颜色
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png')
new_img = img.bitwise_not()
new_img.imshow()
cv2.waitKey(0)
```

14. imshow: 以GUI显示图片
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png')
img.imshow('img1')
cv2.waitKey(0)
```

15. imwrite: 将图片保存到指定路径
```python
from baseImage import Image
import cv2

img = Image(data='tests/image/0.png').cvtColor(cv2.COLOR_BGR2GRAY)
img.imwrite('tests/image/0_gray.png')
```

16. split: 拆分图像通道
- 会直接返回拆分后的数据,不是Image类型
```python
from baseImage import Image

img = Image(data='tests/image/0.png')
img_split = img.split()
```

## Extra
1. SSIM: 图片结构相似性
- resize: 图片缩放大小
```python
from baseImage import SSIM, Image

ssim = SSIM(resize=(600, 600))
img1 = Image('tests/image/0.png')
img2 = Image('tests/image/0.png')
print(ssim.ssim(im1=img1, im2=img2))
```

2. image_diff: 基于SSIM的图片差异对比
```python
from baseImage import ImageDiff, Image
import cv2

diff = ImageDiff()

img1 = Image('tests/image/0.png')
img2 = Image('tests/image/1.png')
cnts = diff.diff(img1, img2)
imageA = img1.data.copy()
imageB = img2.data.copy()
print(len(cnts))
for c in cnts:
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)

cv2.imshow("Original", imageA)
cv2.imshow("Modified", imageB)
cv2.waitKey(0)

```