if(cvImg.channels()==3) //3 channels color image { cv::cvtColor(cvImg,cvImg,CV_BGR2RGB); qImg =QImage((const unsigned char*)(cvImg.data), cvImg.cols, cvImg.rows, cvImg.cols*cvImg.channels(), QImage::Format_RGB888); }
时间: 2024-02-10 08:35:11 浏览: 149
这段代码是用来将 OpenCV 中的 BGR 格式图片转换为 QImage 中的 RGB 格式图片。首先判断图片的通道数是否为3(即是否为彩色图像),如果是,则使用 cv::cvtColor 函数将 BGR 格式图片转换为 RGB 格式图片,然后将转换后的数据作为 QImage 对象的数据构造 QImage 对象。其中,QImage 的构造函数参数依次为图像数据、图像宽度、图像高度、图像每行字节数、图像格式。这段代码的最终目的是将 OpenCV 中的图像数据转换为 Qt 中的图像数据,以便在 Qt 中进行显示或处理。
相关问题
""" Contrast Limited Adaptive Histogram Equalization,CLAHE 对比度受限自适应直方图均衡 """ import cv2 # import numpy as np import matplotlib.pyplot as plt def show_img_with_matplotlib(color_img, title, pos): img_rgb = color_img[:, :, ::-1] plt.subplot(2, 5, pos) plt.imshow(img_rgb) plt.title(title, fontsize=8) plt.axis('off') def equalize_clahe_color_hsv(img): cla = cv2.createCLAHE(clipLimit=4.0) H, S, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV)) eq_V = cla.apply(V) eq_image = cv2.cvtColor(cv2.merge([H, S, eq_V]), cv2.COLOR_HSV2BGR) return eq_image def equalize_clahe_color_lab(img): cla = cv2.createCLAHE(clipLimit=4.0) L, a, b = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2Lab)) eq_L = cla.apply(L) eq_image = cv2.cvtColor(cv2.merge([eq_L, a, b]), cv2.COLOR_Lab2BGR) return eq_image def equalize_clahe_color_yuv(img): cla = cv2.createCLAHE(clipLimit=4.0) Y, U, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2YUV)) eq_Y = cla.apply(Y) eq_image = cv2.cvtColor(cv2.merge([eq_Y, U, V]), cv2.COLOR_YUV2BGR) return eq_image def equalize_clahe_color(img): cla = cv2.createCLAHE(clipLimit=4.0) channels = cv2.split(img) eq_channels = [] for ch in channels: eq_channels.append(cla.apply(ch)) eq_image = cv2.merge(eq_channels) return eq_image # 加载图像 image = cv2.imread('D:/Documents/python/OpenCV/image/008.jpg') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 灰度图像应用 CLAHE clahe = cv2.createCLAHE(clipLimit=2.0) gray_image_clahe = clahe.apply(gray_image) # 使用不同 clipLimit 值 clahe.setClipLimit(5.0) gray_image_clahe_2 = clahe.apply(gray_image) clahe.setClipLimit(10.0) gray_image_clahe_3 = clahe.apply(gray_image) clahe.setClipLimit(20.0) gray_image_clahe_4 = clahe.apply(gray_image) # 彩色图像应用 CLAHE image_clahe_color = equalize_clahe_color(image) image_clahe_color_lab = equalize_clahe_color_lab(image) image_clahe_color_hsv = equalize_clahe_color_hsv(image) image_clahe_color_yuv = equalize_clahe_color_yuv(image) # 标题 plt.figure(figsize=(10, 4)) plt.suptitle("Color histogram equalization with cv2.equalizedHist() - not a good approach", fontsize=9, fontweight='bold') # 可视化 show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "gray", 1) show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=2.0", 2) show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe_2, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=5.0", 3) show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe_3, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=10.0", 4) show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe_4, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=20.0", 5) show_img_with_matplotlib(image, "color", 6) show_img_with_matplotlib(image_clahe_color, "clahe on each channel(BGR)", 7) show_img_with_matplotlib(image_clahe_color_lab, "clahe on each channel(LAB)", 8) show_img_with_matplotlib(image_clahe_color_hsv, "clahe on each channel(HSV)", 9) show_img_with_matplotlib(image_clahe_color_yuv, "clahe on each channel(YUV)", 10) plt.show()
CLAHE,即对比度受限自适应直方图均衡化,是一种用于增强图像对比度的方法。在计算图像直方图均衡化的过程中,CLAHE会先将图像分成许多小块,并对每个小块进行直方图均衡化。由于小块内的像素值范围较小,采取均衡化的结果会使得低对比度的区域增强,同时避免出现像素值过饱和的情况。CLAHE能够在保持图像整体视觉质量的同时,突出图像细节。在OpenCV库中,可以通过cv2.createCLAHE()函数来调用CLAHE算法。
import cv2 import numpy as np #Load two images img1 = cv2.imread('sources/1.jpg') img2 = cv2.imread('sources/3.jpg') #I want to put logo on top-left corner, So I create a ROI rows, cols, channels = img2.shape roi = img1[0:rows, 0:cols] #Now create a mask of logo and create its inverse mask img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) # add a threshold ret,mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV) mask_inv = cv2.bitwise_not(mask) # Now black-out the area of logo in ROI img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv) # Take only region of logo from logo image. img2_fg = cv2.bitwise_and(img2, img2, mask=mask) dst = cv2.add(img1_bg,img2_fg) img1[0:rows, 0:cols] = dst cv2.imshow('res',img1) cv2.waitKey(0) cv2.destroyAllWindows()
这段代码是一个图像融合的示例,将一个图像(img2)上的一部分区域(logo)融合到另一个图像(img1)上。代码的具体步骤如下:
1. 通过cv2.imread函数加载两个图像,分别为img1和img2。
2. 创建一个感兴趣区域(ROI),即img1中要融合logo的位置。
3. 将img2转换为灰度图像,使用cv2.cvtColor函数将其从BGR格式转换为灰度格式,保存在img2gray中。
4. 对img2gray进行阈值处理,通过cv2.threshold函数将灰度图像二值化为掩膜mask。阈值设定为220,即灰度值大于220的像素设为255(白色),小于等于220的像素设为0(黑色)。通过cv2.THRESH_BINARY_INV参数进行反转,使得logo部分为黑色,背景为白色。
5. 对mask进行按位取反操作,得到mask_inv,即将logo部分设为白色,背景部分设为黑色。
6. 对ROI中的图像img1_bg进行按位与操作,使用cv2.bitwise_and函数将ROI与mask_inv进行按位与运算,得到img1_bg,即将ROI中的logo部分变为黑色。
7. 对img2中的图像进行按位与操作,使用cv2.bitwise_and函数将img2与mask进行按位与运算,得到img2_fg,即将img2中的非logo部分变为黑色。
8. 将img1_bg和img2_fg进行图像相加,使用cv2.add函数将两个图像进行相加,得到dst,即融合后的图像。
9. 将dst复制到img1的ROI区域,即将融合后的图像放回原图。
10. 使用cv2.imshow显示结果图像,cv2.waitKey等待按键,cv2.destroyAllWindows关闭窗口。
这段代码实现了将img2中的logo部分融合到img1中的指定位置,最终展示了融合后的结果图像。
阅读全文