OpenCV如何配置在IDEA中自行百度

环境:win10+IDEA2021.2.3+jdk11.0.1+OpenCV-460.jar

一、简介

背景:梯度倒数加权平滑是图像平滑算法的一种,在图像产生、传输和复制过程中,常常会因为多方面原因被噪声干扰或出现数据丢失,降低了图像的质量,需要对图像进行一定的增强处理以减小这些缺陷带来的影响

梯度倒数加权平滑:在一帧离散图像中,相邻区域的变化大于区域内部的变化,在同一区域中中间像素的变化小于边沿像素的变化。梯度值正比于邻域像素灰度级差值,即在图像变化缓慢的区域,梯度值小,反之则大。现在取梯度倒数,该倒数的大小正好与梯度相反,以梯度倒数做权重因子,则区域内部的邻点权重就大于边沿近旁或区域外的邻点。也就是说,这种平滑其贡献主要来自于区域内部的像素,平滑后图像边沿和细节不会受到明显损害

常用的平滑算法有:均值滤波,中值滤波,高斯低通滤波,梯度倒数加权平滑

梯度倒数加权平滑的优点:图像边沿和细节不会受到明显损害;

二、算法流程

(以单波段图像为例)

1.利用OpenCV读入图像,将像素存储在数组里

2.边缘像素不做处理,以3×3模板为例,模板为

规定w( i ,j ) = 1/2,其余系数之和为1/2,定义除中心像素外的其他系数为

对于中心像素与其他像素的差值为0的情况,用如下公式:

通过下面公式将w总和归一化为1/2:

3.进行卷积运算:新像素=0.022×21+0.218×30+0.073×28+0.031×24+0.5×31+0.027×23+0.044×36+0.031×38+0.054×27≈30

4.将经过梯度倒数加权平滑后的像素值存入数组合成图像并存储

三、具体实现

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;/*** @Author: HNUST_jue_chen* @Date: 2022/11/02/ 19:40* @Attention: 转载, 引用请注明出处*/public class GradientReciprocalWeighting {//加载本地动态链接库static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}//梯度倒数加权public Mat gradientReciprocalWeightingFilter(String path) {//使用Mat类存储图像信息Mat mat = Imgcodecs.imread(path);//图像的大小int rows = mat.rows();int cols = mat.cols();//获得原图像像素数组int[][] mat_arr = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {mat_arr[i][j] = (int) mat.get(i, j)[0];}}//用3×3窗口进行梯度倒数加权平滑int[][] mat_arr_gradientReciWeight = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {//处理非边缘像素if (i != 0 && i != rows - 1 && j != 0 && j != cols - 1) {//3×3窗口的原始图像梯度倒数double[][] temp = new double[3][3];temp[0][0] = judgment(mat_arr[i - 1][j - 1] , mat_arr[i][j]);temp[0][1] = judgment(mat_arr[i - 1][j] , mat_arr[i][j]);temp[0][2] = judgment(mat_arr[i - 1][j + 1] , mat_arr[i][j]);temp[1][0] = judgment(mat_arr[i][j - 1] , mat_arr[i][j]);temp[1][1] = 0;temp[1][2] = judgment(mat_arr[i][j + 1] , mat_arr[i][j]);temp[2][0] = judgment(mat_arr[i + 1][j - 1] , mat_arr[i][j]);temp[2][1] = judgment(mat_arr[i + 1][j] , mat_arr[i][j]);temp[2][2] = judgment(mat_arr[i + 1][j + 1] , mat_arr[i][j]);//得到梯度倒数之和double temp_sum = 0.0;for (double[] m : temp) {for (double n : m) {temp_sum += n;}}//归一化后的梯度权重矩阵double[][] temp_normalize = new double[3][3];for (int p = 0; p < temp_normalize.length; p++) {for (int q = 0; q < temp_normalize[0].length; q++) {if (p == 1 && q == 1) {temp_normalize[p][q] = 0.5;} else {temp_normalize[p][q] = temp[p][q] / (2 * temp_sum);}}}//得到新中心像素mat_arr_gradientReciWeight[i][j] = (int) (temp_normalize[0][0] * mat_arr[i - 1][j - 1]+ temp_normalize[0][1] * mat_arr[i - 1][j]+ temp_normalize[0][2] * mat_arr[i - 1][j + 1]+ temp_normalize[1][0] * mat_arr[i][j - 1]+ temp_normalize[1][1] * mat_arr[i][j]+ temp_normalize[1][2] * mat_arr[i][j + 1]+ temp_normalize[2][0] * mat_arr[i + 1][j - 1]+ temp_normalize[2][1] * mat_arr[i + 1][j]+ temp_normalize[2][2] * mat_arr[i + 1][j + 1]);} else {    //处理边缘像素mat_arr_gradientReciWeight[i][j] = mat_arr[i][j];}}}//合成图像Mat mat_gradientReciWeight = new Mat(rows, cols, CvType.CV_32SC1);//将像素放入图像for (int i = 0; i < rows; i++) {//一次放入一行像素值mat_gradientReciWeight.put(i, 0, mat_arr_gradientReciWeight[i]);}return mat_gradientReciWeight;}//进行判断中心像素与边缘像素的差值是否为0public static double judgment(int a, int b) {double c;if (a - b == 0) {c = 1.0;} else {c = 1.0 / (Math.abs(a - b));}return c;}public static void main(String[] args) {GradientReciprocalWeighting grw = new GradientReciprocalWeighting();Mat mat = grw.gradientReciprocalWeightingFilter("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray1.png");//将经过梯度倒数加权平滑后的图像写入文件Imgcodecs.imwrite("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray1_grw.png", mat);}
}

四、结果

1.读入的图像

2.经过梯度倒数加权平滑后的图像

数字图像处理之图像的梯度倒数加权平滑:用Java+OpenCV实现,附源码相关推荐

  1. Python对带光晕的任意纯色背景图像进行去背景色操作(保留透明效果、附源码)

    昨天更新了一个去黑色背景的文章,今天发现可以再适用范围上推广一下,前提是知道背景色的RGB值. Python对带光晕的图像进行去黑底黑色背景操作(附源码) 先上效果图 除了纯白会导致透明度异常,纯红导 ...

  2. 4个数字计算24点java算法(附源码)

    今天看到一个帖子说程序员面试考24点算法,想为什么不用程序来实现呢.在网上没有找到非常完美的算法,包括那个24点计算器,给出的结果重复的也较多.所以自己写了一个.在这儿贴出来给大家分享一下.附源码. ...

  3. 【图像处理】图像直方图+滤波+小波变换+分割处理系统【含GUI Matlab源码 608期】

    ⛄一.图像处理简介 图像处理知识点: 1 数字图像处理及matlab实现知识点总结1-4 2 数字图像处理及matlab实现知识点总结 5-10 ⛄二.部分源代码 unction varargout ...

  4. frame中src怎么设置成一个变量_OpenCV图像人脸检测及视频中的人脸检测(附源码)...

    文章目录 一.数据和知识准备 1. 下载HAAR与LBP数据 2. opencv相关知识 二.python+opencv实现人脸检测 1. 图像单人脸检测 2. 图像多人脸检测 3. 视频中人脸检测 ...

  5. 数字图像处理篇(4)图像增强之平滑操作及opencv实现

    目录 一.噪声 1.椒盐噪声 2.高斯噪声 二.平滑 1.引言 2.中值滤波 3.邻域平均法 4.加权法 三.2D卷积 四.边缘样式 思考一个问题:假如你是灰太狼,你是否愿意吃掉一只满身长满黑点点.脏 ...

  6. 数字图像处理:图像的频域

    数字图像处理:图像的频域 一.图像高频信号和低频信号的理解 1.1 图像中的低频信号和高频信号也叫做低频分量和高频分量. 1)空间频率指的是图像中灰度值相对它的邻居点变化方式.如果一副图像中灰度从一边 ...

  7. 数字图像处理 - Ch2 图像取样与量化

    数字图像处理 Ch2 图像取样与量化 图像取样与量化 概念 数字图像表示 线性索引与坐标索引 空间分辨率 & 灰度分辨率 图像内插 1. 最近邻内插 2. 双线性内插 3. 双三次内插 其他方 ...

  8. 【数字图像处理】图像直方图均衡化、空域滤波(均值滤波、中值滤波)、图像锐化(Laplace算子)、图像傅里叶变换实验

    图像直方图均衡化.空域滤波.图像锐化.图像傅里叶变换 一.图像直方图均衡化 二.图像空域滤波 1.均值滤波(滤波次数n→3) 2.中值滤波(滤波次数n→3) 3.图像锐化(Laplace算子) 三.图 ...

  9. 数字图像处理之图像基础

    最近在学数字图像处理,图像基础包括以下部分: 导入库 import numpy as np import matplotlib.pyplot as plt import cv2 as cv 图片展示函 ...

最新文章

  1. Java并发编程之线程同步
  2. bdbus_lxb下载
  3. 404. Sum of Left Leaves
  4. 方言大全_长沙人亲戚称呼大全!记得收藏以防失传!
  5. CVPR自动驾驶运动预测挑战赛:轻舟智航夺冠方案
  6. java实现冗余校验_循环冗余校验_循环冗余校验码计算_循环冗余校验 java实现(6)...
  7. linux终端中书名号,Linux双引号、单引号和反向单引号
  8. [CQOI2015]选数
  9. 老罗Android开发视频教程 (android解析xml文件 )3集集合
  10. react中一个音频或视频播放的时候其他音视频暂停播放
  11. 通过读取原始星历文件数据推算GPS卫星位置坐标
  12. OpenCV.js 视频入门
  13. python地区房价数据分析_数据分析——房价分析
  14. 毕业设计,基于语音控制的智能家居控制系统
  15. JavaScript之document对象获取元素
  16. 进位位判别法_图解停车进位方法及如何确定车距
  17. 斐波那契数列——输出斐波那契数列的第n项
  18. 拓嘉启远电商:拼多多直通车烧钱太多的原因
  19. html css样式绘制向下或者向上箭头
  20. matlab图像处理英文文献,数字图像处理英文文献翻译参考.doc

热门文章

  1. Python join() 函数 连接字符串
  2. mybatis plus join
  3. JsonPath教程
  4. strcmp比较结果异常的一种可能原因
  5. 问题 :(c语言)箱子匹配
  6. OCP认证033之自制讲稿—调整共享池
  7. 区块链政策3月报:广州集中发布扶持政策 要打造区块链产业城?
  8. excel转实现pdf、图片、base64互转
  9. Linux_起源和虚拟机
  10. ALP300智能型低压马达保护器