Python计算机听觉之OpenCV图像处理——改善夜间图像的照明
发布时间:2025年11月25日 12:19
我们首先新增 cv2 和 NumPy 并编订参数来借助白照射连接线。左图片材质存储在变数 M 和 N 里。对左图片领域API较小一半的缓冲以确保它们的较小保持也就是说。用到 np.min 以赢收转动块里的最高于左图形参数最终赢收虹连接线。值得注意地,通过用到 np.max 赢收该转动块里的最高于左图形参数最终赢收光连接线。我们将须要要虹连接线和光连接线的参数以开展先入一步的方法。所以我们赶回这些参数。值得注意的编码是为 C++ 编订的,如下所示。
C++
std::pair get_illumination_channel(cv::Mat I, float w) {int N = I.size[0];int M = I.size[1];cv::Mat darkch = cv::Mat::zeros(cv::Size(M, N), CV_32FC1);cv::Mat brightch = cv::Mat::zeros(cv::Size(M, N), CV_32FC1);int padding = int(w/2);// padding for channelscv::Mat padded = cv::Mat::zeros(cv::Size(M + 2*padding, N + 2*padding), CV_32FC3);for (int i=padding; i < padding + M; i++) {for (int j=padding; j < padding + N; j++) {padded.at(j, i).val[0] = (float)I.at(j-padding, i-padding).val[0]/255;padded.at(j, i).val[1] = (float)I.at(j-padding, i-padding).val[1]/255;padded.at(j, i).val[2] = (float)I.at(j-padding, i-padding).val[2]/255;}}for (int i=0; i < darkch.size[1]; i++) {int col_up, row_up;col_up = int(i+w);for (int j=0; j < darkch.size[0]; j++) {double minVal, maxVal;row_up = int(j+w);cv::minMaxLoc(padded.colRange(i, col_up).rowRange(j, row_up), PriceminVal, PricemaxVal);darkch.at(j,i) = minVal; //dark channelbrightch.at(j,i) = maxVal; //bright channel}}return std::make_pair(darkch, brightch);}虹连接线和光连接线是通过用零初讫化乘积并用左图片数组里的参数缓冲它们来赢收的,其里 CV_32FC1 定义了每个元素的深度和连接线数。
缓冲以API较小的一半应常用左图片,以确保它们的较小保持也就是说。我们迭代乘积以赢收该块里的最高于左图形参数,常用分设虹连接线左图形参数。赢收该块里的最高于左图形参数为我们发放了光连接线左图形参数。 cv::minMaxLoc 常用查找数组里的具体来说最小参数和远超过参数。
零碎的单项CVS及创作者,可以私信“333”借助!!!右边边−虹连接线逻辑上,右边−光连接线逻辑上
3.2第 2 步:近似值具体来说太阳辐射白照射下一步是近似值具体来说太阳辐射白照射。它是用到右边赢收的光连接线通过收之前 10% 数值的平均参数来近似值的。收 10% 的参数是为了确保一个小的异常不但会对其产生较大的负面影响。
零碎的单项CVS及创作者,可以私信“333”借助!!!具体来说太阳辐射白光的近似值及其对越来越佳深夜左图片灯光的成就
Python
def get_atmosphere(I, brightch, p=0.1):M, N = brightch.shapeflatI = I.reshape(M*N, 3) # reshaping image arrayflatbright = brightch.ravel() #flattening image arraysearchidx = (-flatbright).argsort()[:int(M*N*p)] # sorting and slicingA = np.mean(flatI.take(searchidx, axis=0), dtype=np.float64, axis=0)return A为了通过编码实现这一点,根据远超过数值对左图片开展变形、展平和加权。左图片乘积被切片以仅还包括之前百分之十的左图形,然后收这些的平均参数。
C++
cv::Mat get_atmosphere(cv::Mat I, cv::Mat brightch, float p=0.1) {int N = brightch.size[0];int M = brightch.size[1];// flattening and reshaping image arraycv::Mat flatI(cv::Size(1, N*M), CV_8UC3);std::vector> flatBright;for (int i=0; i < M; i++) {for (int j=0; j < N; j++) {int index = i*N + j;flatI.at(index, 0).val[0] = I.at(j, i).val[0];flatI.at(index, 0).val[1] = I.at(j, i).val[1];flatI.at(index, 0).val[2] = I.at(j, i).val[2];flatBright.push_back(std::make_pair(-brightch.at(j, i), index));}}// sorting and slicing the arraysort(flatBright.begin(), flatBright.end());cv::Mat A = cv::Mat::zeros(cv::Size(1, 3), CV_32FC1);for (int k=0; k < int(M*N*p); k++) {int sindex = flatBright[k].second;A.at(0, 0) = A.at(0, 0) + (float)flatI.at(sindex, 0).val[0];A.at(1, 0) = A.at(1, 0) + (float)flatI.at(sindex, 0).val[1];A.at(2, 0) = A.at(2, 0) + (float)flatI.at(sindex, 0).val[2];}A = A/int(M*N*p);return A/255;}3.3第 3 步:查找初讫入射光左图入射光左图刻画了未被极化并到达相机的白光部分。在该解法里,将用到请注意等式从光连接线逻辑上有约:
是太阳辐射白光局部区外的远超过参数。
Python
def get_initial_transmission(A, brightch):A_c = np.max(A)init_t = (brightch-A_c)/(1.-A_c) # 初讫入射光左图return (init_t - np.min(init_t))/(np.max(init_t) - np.min(init_t)) # 标量初讫入射光左图在编码里,用到数学公式近似值初讫入射光左图,然后常用近似值标量初讫入射光左图。
C++
cv::Mat get_initial_transmission(cv::Mat A, cv::Mat brightch) {double A_n, A_x, minVal, maxVal;cv::minMaxLoc(A, PriceA_n, PriceA_x);cv::Mat init_t(brightch.size(), CV_32FC1);init_t = brightch.clone();// 初讫入射光左图init_t = (init_t - A_x)/(1.0 - A_x);cv::minMaxLoc(init_t, PriceminVal, PricemaxVal);// 标量初讫入射光左图init_t = (init_t - minVal)/(maxVal - minVal);return init_t;}初讫入射光左图
3.4第 4 步:用到虹连接线有约校正后的入射光左图还根据虹连接线逻辑上近似值入射光左图,并近似值逻辑上密切关系的各不相同。开展此近似值是为了不对从光连接线逻辑上赢收的潜在误解入射光有约。
任何不具小于 alpha 分设参数(由潜能实验确定为 0.4)的
连接线的左图形 x 都坐落黑虹取向里,这使得其深度不可靠。这也使得左图形 x 的入射光不可靠。因此,不可靠的入射光可以通过借助链路左图的乘积来不对。
Python
def get_corrected_transmission(I, A, darkch, brightch, init_t, alpha, omega, w):im = np.empty(I.shape, I.dtype);for ind in range(0, 3):im[:, :, ind] = I[:, :, ind] / A[ind] #将左图形参数除以太阳辐射白光dark_c, _ = get_illumination_channel(im, w) # 虹连接线入射光左图dark_t = 1 - omega*dark_c # 简化虹连接线入射光左图corrected_t = init_t # 用初讫入射光左图初讫化校正入射光左图diffch = brightch - darkch # 感应左图密切关系的差for i in range(diffch.shape[0]):for j in range(diffch.shape[1]):if(diffch[i, j] < alpha):corrected_t[i, j] = dark_t[i, j] * init_t[i, j]return np.abs(corrected_t)我们用到在第一个编码片段里成立的 get_illumination_channel 参数来借助虹连接线入射光左图。参数 omega 通常分设为 0.75,常用校正初讫入射光左图。校正后的入射光左图被初讫化为初讫入射光左图。如果虹连接线和光连接线密切关系的各不相同远大于 alpha,即 0.4,它的参数将保持与初讫入射光左图不尽相同。如果任何地方的各不相同都小于 alpha,我们就收右边提到的入射光左图的乘积。
C++
cv::Mat get_corrected_transmission(cv::Mat I, cv::Mat A, cv::Mat darkch, cv::Mat brightch, cv::Mat init_t, float alpha, float omega, int w) {cv::Mat im3(I.size(), CV_32FC3);//将左图形参数除以太阳辐射白光for (int i=0; i < I.size[1]; i++) {for (int j=0; j < I.size[0]; j++) {im3.at(j, i).val[0] = (float)I.at(j, i).val[0]/A.at(0, 0);im3.at(j, i).val[1] = (float)I.at(j, i).val[1]/A.at(1, 0);im3.at(j, i).val[2] = (float)I.at(j, i).val[2]/A.at(2, 0);}}cv::Mat dark_c, dark_t, diffch;std::pair illuminate_channels = get_illumination_channel(im3, w);// 虹连接线感应左图dark_c = illuminate_channels.first;// 简化虹连接线入射光左图dark_t = 1 - omega*dark_c;cv::Mat corrected_t = init_t;diffch = brightch - darkch; //感应左图密切关系的差for (int i=0; i < diffch.size[1]; i++) {for (int j=0; j < diffch.size[0]; j++) {if (diffch.at(j, i) < alpha) {// 用初讫入射光左图初讫化校正入射光左图corrected_t.at(j, i) = abs(dark_t.at(j, i)*init_t.at(j, i));}}}return corrected_t;}简化入射光左图
3.5第 5 步:用到Guided Filter平直入射光左图让我们来看看Guided Filter的定义:Guided Filter与其他卷积可用一样,是一种邻域可用,但在近似值可用左图形参数时,但会考量Guided左图片里相应空间邻域里某个区外的统计资讯。
质上,它是一个楔形沿用平直小波。我已经用到了这个 GitHub 存储库的实现。将此小波应常用右边赢收的校正入射光左图以赢收越来越精细的左图片。
领域GuidedFilter后赢收的入射光左图
各种入射光左图密切关系的比较
3.6第 6 步:近似值结果左图片须要要入射光左图和太阳辐射白光参数来赢收弱化左图片。今天我们有了所须要的参数,可以领域第一个方程来赢收结果。
Python
def get_final_image(I, A, refined_t, tmin):refined_t_broadcasted = np.broadcast_to(refined_t[:, :, None], (refined_t.shape[0], refined_t.shape[1], 3)) # 将2D精炼左图的连接线复制到3个连接线J = (I-A) / (np.where(refined_t_broadcasted < tmin, tmin, refined_t_broadcasted)) + A # 得到最终结果return (J - np.min(J))/(np.max(J) - np.min(J)) # 标量左图片首先将直方图精炼离散左图转换成为直方图左图,保证原左图和离散左图的连接线数不尽相同。接下来,用到等式近似值可用左图片。然后将此左图片开展远超过最小标量并从参数赶回。
C++
cv::Mat get_final_image(cv::Mat I, cv::Mat A, cv::Mat refined_t, float tmin) {cv::Mat J(I.size(), CV_32FC3);for (int i=0; i < refined_t.size[1]; i++) {for (int j=0; j < refined_t.size[0]; j++) {float temp = refined_t.at(j, i);if (temp < tmin) {temp = tmin;}// finding resultJ.at(j, i).val[0] = (I.at(j, i).val[0] - A.at(0,0))/temp + A.at(0,0);J.at(j, i).val[1] = (I.at(j, i).val[1] - A.at(1,0))/temp + A.at(1,0);J.at(j, i).val[2] = (I.at(j, i).val[2] - A.at(2,0))/temp + A.at(2,0);}}double minVal, maxVal;cv::minMaxLoc(J, PriceminVal, PricemaxVal);// normalized imagefor (int i=0; i < J.size[1]; i++) {for (int j=0; j < J.size[0]; j++) {J.at(j, i).val[0] = (J.at(j, i).val[0] - minVal)/(maxVal - minVal);J.at(j, i).val[1] = (J.at(j, i).val[1] - minVal)/(maxVal - minVal);J.at(j, i).val[2] = (J.at(j, i).val[2] - minVal)/(maxVal - minVal);}}return J;}最终结果
4.先入一步革最初虽然左图片充满情调,但看起来很模糊,锐化但会越来越佳画面。我们可以将 cv2.detailEnhance() 常用此使命,但这但会缩加电磁干扰。所以我们可以用到 cv2.edgePreservingFilter() 来允许它。但是,此功能仍但会惹来一些电磁干扰。因此,如果左图片从一开讫就很吵杂,那么这样做这不理想。
要越来越深入地探究这些关键技术,请参阅本文。
先入一步弱化的左图片
类似左图片与结果的比较
5.在实践里如果左图片里有任何清楚的白光源(如灯)或自然白光源(如星辰)覆盖了左图片的较大一部分,则该分析方法的效果不佳。为什么这是一个缺陷?因为这样的白光源但会提高太阳辐射数值。当我们在寻找最光的10%的左图形时,这将随之而来这些区外极度曝白光。
这种因果关系在比如说的左图片里比较集里辨识出来。
为了克服这个缺陷,让我们分析一下由光连接线制作的初讫入射光左图。
零碎的单项CVS及创作者,可以私信“333”借助!!!初讫入射光左图
该使命显然是减缓这些随之而来这些区外极度曝白光的最弱烈白色深褐色。这可以通过将参数从 255 允许为某个最小参数来顺利先入行。
Pythondef reduce_init_t(init_t):init_t = (init_t*255).astype(np.uint8)xp = [0, 32, 255]fp = [0, 32, 48]x = np.arange(256) # 成立数组[0,...,255]table = np.interp(x, xp, fp).astype('uint8') # 根据 xp 在 x 范围内绑参数 fpinit_t = cv2.LUT(init_t, table) # 查找表init_t = init_t.astype(np.float64)/255 # 标准化入射光左图return init_t为了用编码实现这一点,入射光左图被转换成为 0-255 的范围。然后用到查找表将点从类似参数内绑到最初范围,从而减缓高曝白光的负面影响。
C++
cv::Mat reduce_init_t(cv::Mat init_t) {cv::Mat mod_init_t(init_t.size(), CV_8UC1);for (int i=0; i < init_t.size[1]; i++) {for (int j=0; j < init_t.size[0]; j++) {mod_init_t.at(j, i) = std::min((int)(init_t.at(j, i)*255), 255);}}int x[3] = {0, 32, 255};int f[3] = {0, 32, 48};// creating array [0,...,255]cv::Mat table(cv::Size(1, 256), CV_8UC1);//Linear Interpolationint l = 0;for (int k = 0; k < 256; k++) {if (k> x[l+1]) {l = l + 1;}float m = (float)(f[l+1] - f[l])/(x[l+1] - x[l]);table.at(k, 0) = (int)(f[l] + m*(k - x[l]));}//Lookup tablecv::LUT(mod_init_t, table, mod_init_t);for (int i=0; i < init_t.size[1]; i++) {for (int j=0; j < init_t.size[0]; j++) {// normalizing the transmission mapinit_t.at(j, i) = (float)mod_init_t.at(j, i)/255;}}return init_t;}下左图是编码里的这种调整将如何负面影响左图形的直观说明。
零碎的单项CVS及创作者,可以私信“333”借助!!!减缓极度曝白光的左图形说明
零碎的单项CVS及创作者,可以私信“333”借助!!!变越来越后的入射光左图
零碎的单项CVS及创作者,可以私信“333”借助!!!入射光左图对比
我们可以看到用到篇文章里的分析方法弱化赢收的左图片与我们刚刚咨询的解决分析方法赢收的结果密切关系的各不相同。
零碎的单项CVS及创作者,可以私信“333”借助!!!右边边−类似左图片,里心−较早生如此一来的弱化左图片,右边−先入一步弱化的左图片。
6.结果再一一步是成立一个结合所有关键技术并将其作为左图片发送到的参数。
Python
def dehaze(I, tmin=0.1, w=15, alpha=0.4, omega=0.75, p=0.1, eps=1e-3, reduce=False):I = np.asarray(im, dtype=np.float64) # Convert the input to a float array.I = I[:, :, :3] / 255m, n, _ = I.shapeIdark, Ibright = get_illumination_channel(I, w)A = get_atmosphere(I, Ibright, p)init_t = get_initial_transmission(A, Ibright)if reduce:init_t = reduce_init_t(init_t)corrected_t = get_corrected_transmission(I, A, Idark, Ibright, init_t, alpha, omega, w)normI = (I - I.min()) / (I.max() - I.min())refined_t = guided_filter(normI, corrected_t, w, eps) # applying guided filterJ_refined = get_final_image(I, A, refined_t, tmin)enhanced = (J_refined*255).astype(np.uint8)f_enhanced = cv2.detailEnhance(enhanced, sigma_s=10, sigma_r=0.15)f_enhanced = cv2.edgePreservingFilter(f_enhanced, flags=1, sigma_s=64, sigma_r=0.2)return f_enhancedC++
int main() {cv::Mat img = cv::imread("dark.png");float tmin = 0.1;int w = 15;float alpha = 0.4;float omega = 0.75;float p = 0.1;double eps = 1e-3;bool reduce = false;std::pair illuminate_channels = get_illumination_channel(img, w);cv::Mat Idark = illuminate_channels.first;cv::Mat Ibright = illuminate_channels.second;cv::Mat A = get_atmosphere(img, Ibright);cv::Mat init_t = get_initial_transmission(A, Ibright);if (reduce) {init_t = reduce_init_t(init_t);}double minVal, maxVal;// Convert the input to a float arraycv::Mat I(img.size(), CV_32FC3), normI;for (int i=0; i < img.size[1]; i++) {for (int j=0; j < img.size[0]; j++) {I.at(j, i).val[0] = (float)img.at(j, i).val[0]/255;I.at(j, i).val[1] = (float)img.at(j, i).val[1]/255;I.at(j, i).val[2] = (float)img.at(j, i).val[2]/255;}}cv::minMaxLoc(I, PriceminVal, PricemaxVal);normI = (I - minVal)/(maxVal - minVal);cv::Mat corrected_t = get_corrected_transmission(img, A, Idark, Ibright, init_t, alpha, omega, w);cv::Mat refined_t(normI.size(), CV_32FC1);// applying guided filterrefined_t = guidedFilter(normI, corrected_t, w, eps);cv::Mat J_refined = get_final_image(I, A, refined_t, tmin);cv::Mat enhanced(img.size(), CV_8UC3);for (int i=0; i < img.size[1]; i++) {for (int j=0; j < img.size[0]; j++) {enhanced.at(j, i).val[0] = std::min((int)(J_refined.at(j, i).val[0]*255), 255);enhanced.at(j, i).val[1] = std::min((int)(J_refined.at(j, i).val[1]*255), 255);enhanced.at(j, i).val[2] = std::min((int)(J_refined.at(j, i).val[2]*255), 255);}}cv::Mat f_enhanced;cv::detailEnhance(enhanced, f_enhanced, 10, 0.15);cv::edgePreservingFilter(f_enhanced, f_enhanced, 1, 64, 0.2);cv::imshow("im", f_enhanced);cv::waitKey(0);return 0;}看看比如说的 gif 辨识了用到此解法弱化的其他一些左图片。
零碎的单项CVS及创作者,可以私信“333”借助!!!右边边:类似左图片,右边:弱化左图片
零碎的单项CVS及创作者,可以私信“333”借助!!!右边边 − 原 讫 左图 像 , 里 心 − 较 早 生 如此一来 的 缩 最弱 左图 像 , 右边 − 先入 一 步 缩 最弱 的 左图 像 。 右边边 - 类似左图片,里心 - 较早生如此一来的弱化左图片,右边 - 先入一步弱化的左图片。
结论总而言之,我们首先探究与在白太阳光太低或高于白照射条件下拍的左图片方面的缺陷。我们逐步咨询了 Shi 等人提出的分析方法。来弱化这样的左图片。我们还咨询了篇文章里参阅的关键技术的先入一步革最初和在实践里。
该篇文章提出了一种提高高于白光左图片灯光的出色关键技术。但是,它仅适常用讫终保持恒定灯光的左图片。正如所承诺的,我们还理解了一种解决分析方法,以克服不具光点的左图片的在实践里,例如左图片里的满月或灯。
对于这种分析方法的愿景的发展,我们可以尝试通过轨迹亦同来控制这种减缓。轨迹亦同将借助用户越来越好地理解弱化的适当参数并分设单个左图片所须要的最佳参数。
零碎的单项CVS及创作者,可以私信“333”借助!!!
参考资料目录
。福建知名白癜风医院福建看白癜风去哪里
泉州白癜风医院在哪
福建治疗白癜风医院地址
泉州医院哪家白癜风医院好
咳嗽药
丰胸药
退热药
毛发整形
白内障的早期症状
- 2022年正泽公立学校首招初中生
- 夫妻俩被孤立时,父母的态度会影响夫妻俩的一生!
- 东亚家庭最需教育的不是孩子,而是父母,尤其是爸爸
- 中国家庭最需教育的不是兄弟姐妹,而是父母,尤其是爸爸
- 初中生早恋的5种都还,不少学生“中招”,希望你家没有
- 高三早恋的5种迹象,不少学生“中招”,希望你家没有
- 女孩最好的状态,每天化个淡妆,穿着自己喜欢的衣服,不羡慕谁,也不依赖谁,悄悄努力变强大,活成自己喜欢的样子vlog十亿流量扶持原计划日常vlog Bjorg倍优禾
- 硬核服务设施圈粉全城,龙湖·天玺热领合肥
- 为什么你说是长得挺好看,却总让人记不住?看完这篇就知道了
- 41岁卡戴珊白金短发亮相红毯!身穿价值3000万领带,彰显颜值气质
- 凹凸有致的瑜伽裤姐妹花!看着就醉了,轮廓太美了!
- 任达华钟楚红同框差6岁气质不同,一个霸气一个妩媚,各有各的美
- 有一种奶奶喜欢瑜伽裤,让着装造型远离廉价感,仪态典雅
- 邱淑贞女儿韩国时装周,玩制服杀配长裤太撩人,大长腿不输明星妈
