opencv图片显示问题

做项目时遇到一个问题,我想把一张图片的r,g,b通道分离出来显示,又希望在显示不同分辨率的图片时窗口大小能统一,就设置了一个640*480大小的窗口。但是使用imshow函数对三个通道的分别显示时,只显示了最后一个通道的图片,有什么解决办法吗?

以下内容部分参考ChatGPT模型:


可以使用resize函数将原图缩放至640*480大小,然后再分离通道进行显示。具体代码如下:

import cv2

# 读取原图
img = cv2.imread('test.jpg')

# 缩放至640*480大小
img_resized = cv2.resize(img, (640, 480))

# 分离通道并显示
b, g, r = cv2.split(img_resized)
cv2.imshow('Blue Channel', b)
cv2.imshow('Green Channel', g)
cv2.imshow('Red Channel', r)

cv2.waitKey(0)
cv2.destroyAllWindows()

这样可以保证不同分辨率的图片在同一个窗口下显示大小一致,同时也可以分离出RGB通道进行显示。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7789219
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:OpenCV入门:读取图像以及对图像进行一些操作,比如只提取某颜色部分的东西
  • 除此之外, 这篇博客: 【opencv学习】调用摄像头实现多通道分离显示中的  最后,将其合并在一起,就实现了功能,附上完整代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • import cv2 as cv
    import time
    
    cap = cv.VideoCapture(0)
    start_time = time.time()
    counter = 0
    if not cap.isOpened():
        print("Cannot open camera")
        exit()
    
    def show_img(win_name,img,wait_time=0,img_ratio=0.5,is_show=True):
        if is_show is not True:
            return
        rows = img.shape[0]
        cols = img.shape[1]
        cv.namedWindow(win_name, cv.WINDOW_NORMAL )#cv2.WINDOW_AUTOSIZE)
        cv.resizeWindow(win_name,(int(cols*img_ratio),int(rows*img_ratio)))
        cv.imshow(win_name,img)
    
    while cap.isOpened():
        # 逐帧捕获
        ret, frame = cap.read(1) #ret为布尔值,frame是图片的三维数组形式
    
        # 如果正确读取帧,ret为True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        # 我们在框架上的操作到这里
        str1 = f'size:{cap.get(3)}*{cap.get(4)}'
        counter += 1
        if(time.time()-start_time) != 0:
            FPS = counter/(time.time()-start_time)
            counter = 0
            start_time = time.time()
        str2 = f'FPS:{int(FPS)}'
        str3 = f'{cap.get(8)}'
    
        font = cv.FONT_HERSHEY_SIMPLEX
        cv.putText(frame, str1, (5, 30), font, 1, (255, 255, 255), 2, cv.LINE_AA)
        cv.putText(frame, str2, (5, 55), font, 1, (255, 255, 255), 2, cv.LINE_AA)
        cv.putText(frame, str3, (5, 75), font, 1, (255, 255, 255), 2, cv.LINE_AA)
    
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        # 显示结果帧e
        cv.imshow('frame',frame)
        cv.imshow('GRAY',gray)
        # time.sleep(1/cap.get(cv.CAP_PROP_FPS))
        if frame is not None and len(frame.shape)==3:
            if frame.shape[2] == 3:  # 如果是3通道,分离出3个图像实例
                b, g, r = cv.split(frame)
                show_img('blue', b, -1)
                show_img('green', g, -1)
                show_img('red', r, -1)
    
            elif frame.shape[2] == 4:  # 如果是4通道
                b, g, r, a = cv.split(frame)
                show_img('b', b, -1)
                show_img('g', g, -1)
                show_img('r', r, -1)
                show_img('a', a, -1)
    
        if cv.waitKey(1) == ord('q'):
            break
    # 完成所有操作后,释放捕获器
    cap.release()
    cv.destroyAllWindows()

  • 您还可以看一下 AI100讲师老师的计算机视觉实战:如何使用OpenCV构建视觉应用课程中的 计算机视觉实战:如何使用OpenCV快速构建视觉应用小节, 巩固相关知识点

你的提问的表达并不清晰。
我推测你的问题,是将 RGB 通道分拆为 R/G/B 三个通道,这时不能得到 R/G/B 对应的颜色,因为拆分的三个通道都是 单通道了。而单通道图像,在 CV 或其它软件中,只是一张灰度图像,而不会认为是 R\G\B 颜色图像。
如果要得到 R/G/B 颜色通道的图像,就要把 拆分的颜色通道的图像,加入另外两个通道(像素值 0),构成 3通道,这样才能显示出 R、G、B颜色通道的效果。
当然,也可以直接在 3通道图像中,依次对 RG 通道置零得到 B 通道,。。。以此类推