OpenCV图像操作类

人工智能 2025-04-17 09:50:51

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()
    

...全文
106 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4

社区成员

发帖
与我相关
我的任务
社区描述
学习交流人工智能相关算法及技术栈
opencv计算机视觉人工智能 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 亿只小灿灿
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧