4
社区成员
发帖
与我相关
我的任务
分享import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
class OpenCVOps:
def __init__(self):
pass
def access_and_modify_pixel(self, image_path, pixel_x=100, pixel_y=100, new_pixel_value=[255, 255, 255]):
"""
访问和修改图像的像素值。
参数:
image_path (str): 图像文件的路径。
pixel_x (int): 要访问和修改的像素的x坐标,默认为100。
pixel_y (int): 要访问和修改的像素的y坐标,默认为100。
new_pixel_value (list): 新的像素值,格式为 [B, G, R],默认为 [255, 255, 255]。
引用实例:
opencv = OpenCVOps()
opencv.access_and_modify_pixel('66.png', 150, 150, [0, 255, 0])
"""
img = cv.imread(image_path)
if img is not None:
px = img[pixel_y, pixel_x]
print(px)
blue = img[pixel_y, pixel_x, 0]
print(blue)
img[pixel_y, pixel_x] = new_pixel_value
print(img[pixel_y, pixel_x])
self.show_and_destroy_image(img, 'pkq.png')
else:
print(f"无法加载图像: {image_path}")
def get_image_properties(self, image_path):
"""
获取图像的属性,如行数、列数、通道数、数据类型和像素数。
参数:
image_path (str): 图像文件的路径。
引用实例:
opencv = OpenCVOps()
opencv.get_image_properties('66.png')
"""
img = cv.imread(image_path)
if img is not None:
print(img.shape)
print(img.size)
print(img.dtype)
else:
print(f"无法加载图像: {image_path}")
def roi_operation(self, image_path, roi_src=(280, 340, 330, 390), roi_dst=(273, 333, 100, 160)):
"""
进行图像感兴趣区域(ROI)操作。
参数:
image_path (str): 图像文件的路径。
roi_src (tuple): 源ROI区域,格式为 (y1, y2, x1, x2),默认为 (280, 340, 330, 390)。
roi_dst (tuple): 目标ROI区域,格式为 (y1, y2, x1, x2),默认为 (273, 333, 100, 160)。
引用实例:
opencv = OpenCVOps()
opencv.roi_operation('66.png', (200, 250, 200, 250), (100, 150, 100, 150))
"""
img = cv.imread(image_path)
if img is not None:
y1_src, y2_src, x1_src, x2_src = roi_src
y1_dst, y2_dst, x1_dst, x2_dst = roi_dst
ball = img[y1_src:y2_src, x1_src:x2_src]
img[y1_dst:y2_dst, x1_dst:x2_dst] = ball
self.show_and_destroy_image(img, 'pkq.png')
else:
print(f"无法加载图像: {image_path}")
def set_image_border(self, image_path, border_size=10, border_color=[255, 0, 0]):
"""
为图像设置边框(填充)。
参数:
image_path (str): 图像文件的路径。
border_size (int): 边框的大小,默认为10。
border_color (list): 常量边框的颜色,格式为 [B, G, R],默认为 [255, 0, 0]。
引用实例:
opencv = OpenCVOps()
opencv.set_image_border('66.png', 20, [0, 255, 0])
"""
img1 = cv.imread(image_path)
if img1 is not None:
replicate = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_WRAP)
constant = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_CONSTANT, value=border_color)
plt.subplot(231), plt.imshow(img1, '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()
else:
print(f"无法加载图像: {image_path}")
def image_blending(self, image_path1, image_path2, alpha=0.7, beta=0.3, gamma=0):
"""
进行图像融合操作。
参数:
image_path1 (str): 第一张图像文件的路径。
image_path2 (str): 第二张图像文件的路径。
alpha (float): 第一张图像的权重,默认为0.7。
beta (float): 第二张图像的权重,默认为0.3。
gamma (float): 亮度调整值,默认为0。
引用实例:
opencv = OpenCVOps()
opencv.image_blending('1.jpg', '0.jpg', 0.6, 0.4, 10)
"""
img1 = cv.imread(image_path1)
img2 = cv.imread(image_path2)
if img1 is not None and img2 is not None:
dst = cv.addWeighted(img1, alpha, img2, beta, gamma)
self.show_and_destroy_image(dst, 'dst')
else:
print(f"无法加载图像: {image_path1} 或 {image_path2}")
def bitwise_operation(self, image_path1, image_path2, threshold_value=10):
"""
进行图像的按位运算操作。
参数:
image_path1 (str): 第一张图像文件的路径。
image_path2 (str): 第二张图像文件的路径。
threshold_value (int): 二值化阈值,默认为10。
引用实例:
opencv = OpenCVOps()
opencv.bitwise_operation('1.jpg', '0.jpg', 20)
"""
img1 = cv.imread(image_path1)
img2 = cv.imread(image_path2)
if img1 is not None and img2 is not None:
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, threshold_value, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
img2_fg = cv.bitwise_and(img2, img2, mask=mask)
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
self.show_and_destroy_image(img1,'res')
else:
print(f"无法加载图像: {image_path1} 或 {image_path2}")
def performance_measurement(self, image_path, operation_func, *args, **kwargs):
"""
衡量图像操作的性能。
参数:
image_path (str): 图像文件的路径。
operation_func (function): 要执行的图像操作函数。
*args: 传递给操作函数的位置参数。
**kwargs: 传递给操作函数的关键字参数。
引用实例:
opencv = OpenCVOps()
def sample_operation(image, param1):
# 示例操作,比如简单的灰度转换
return cv.cvtColor(image, cv.COLOR_BGR2GRAY)
opencv.performance_measurement('66.png', sample_operation, param1=10)
"""
img = cv.imread(image_path)
if img is not None:
e1 = cv.getTickCount()
result = operation_func(img, *args, **kwargs)
e2 = cv.getTickCount()
time = (e2 - e1) / cv.getTickFrequency()
print(f"操作耗时: {time} 秒")
if result is not None:
self.show_and_destroy_image(result, 'performance_result')
else:
print(f"无法加载图像: {image_path}")
def show_and_destroy_image(self, img, window_name='draw'):
"""
显示图像并等待按键,最后销毁窗口。
参数:
img (np.ndarray): 要显示的图像。
window_name (str): 窗口的名称,默认为 'draw'。
"""
cv.imshow(window_name, img)
cv.waitKey(0)
cv.destroyAllWindows()