opencv 之 extractChannel 用法

opencv 之 extractChannel 用法

#include <stdio.h>
#include <assert.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
#define SIZE 4
/**
 *Mat img = imread("a.jpg", IMREAD_UNCHANGED);
 *	Mat img(size, CV_8UC3, Scalar(255, 255, 255));
 *
 */

int main(int argc, char **argv) {
	Mat img(SIZE, SIZE, CV_8UC3, Scalar(0, 0, 255));
	Mat img2;
	Mat img30;
	Mat img1;
	extractChannel(img, img1, 0);
	extractChannel(img, img2, 1);
	extractChannel(img, img30, 2);
	Mat img3[3];
	img3[0] = img2;
	img3[1] = img30;
	img3[2] = img1;
	Mat img4;
	merge(img3, 3, img4);
	imwrite("out.jpg", img4);
	namedWindow("opencv", WINDOW_FREERATIO);
	imshow("111", img4);
	int k = waitKey(0);
	return 0;
}

暗通道先验( Dark Channel Prior) 是一种基于图像先验的图像去雾方法,该方法假设任何自然图像的某些局部区域中,至少有一个颜色通道具有较低的像素值,这些区域被称为暗通道。该方法通过计算暗通道来估计场景中的大气光照,并使用该估计值从原始图像中去除雾霾。下面是一个简单的步骤,演示如何使用暗通道方法实现图像去雾: 1. 读取原始图像并将其转换为灰度:使用CVI的imread()函数读取原始图像,并使用CVI的cvtColor()函数将其转换为灰度图像。 2. 计算暗通道:对灰度图像进行滤波操作,然后计算每个像素的暗通道值。可以通过使用CVI的min()函数来计算每个像素的最小值。 3. 估计大气光照:选择暗通道值最大的一些像素,并计算它们在RGB颜色空间中的平均值,即为大气光照的估计值。 4. 去除雾霾:对原始图像进行颜色校正,以去除由雾霾引起的色偏。可以使用以下方程式来进行颜色校正: J(x) = (I(x) - A) / t(x) + A 其中,J(x)是去雾后的像素值,I(x)是原始图像的像素值,A是估计的大气光照,t(x)是透射率。 透射率可以通过以下方程式计算: t(x) = 1 - w * min{C(x) / A} 其中,w是一个权重参数,C(x)是原始图像在暗通道中的最小值,A是估计的大气光照。 5. 显示去雾后的图像:使用CVI的imshow()函数将去雾后的图像显示在输出窗口中。 下面是一个简单的示例代码,演示了如何使用暗通道方法实现图像去雾: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取原始图像并将其转换为灰度 Mat img = imread("foggy_image.jpg", IMREAD_GRAYSCALE); // 计算暗通道 Mat dark_channel; int patch_size = 15; boxFilter(img, dark_channel, CV_8U, Size(patch_size, patch_size), Point(-1, -1), true, BORDER_REFLECT); Mat min_channel = Mat::zeros(img.size(), CV_8U); for (int i = 0; i < img.channels(); i++) { Mat channel = img.clone(); extractChannel(dark_channel, channel, i); min(min_channel, channel, min_channel); } // 估计大气光照 Scalar A = mean(img, min_channel); // 去除雾霾 float w = 0.95; Mat t = Mat::ones(img.size(), CV_32F); for (int i = 0; i < img.channels(); i++) { Mat channel = img.clone(); extractChannel(dark_channel, channel, i); divide(min_channel, channel, channel); multiply(w, channel, channel); subtract(1, channel, channel); multiply(t, channel, t); } Mat J = Mat::zeros(img.size(), CV_32F); float t_min = 0.1; for (int i = 0; i < img.channels(); i++) { Mat channel = img.clone(); extractChannel(channel, channel, i); subtract(channel, A[i], channel); divide(channel, max(t, t_min), channel); add(channel, A[i], channel); insertChannel(channel, J, i); } J.convertTo(J, CV_8U); // 显示去雾后的图像 namedWindow("Dehazed Image", WINDOW_NORMAL); imshow("Dehazed Image", J); waitKey(0); // 释放内存 img.release(); dark_channel.release(); min_channel.release(); t.release(); J.release(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值