局部增强

#include<iostream>
#include<cv.hpp>
#include<highgui.hpp>
using namespace std;
using namespace cv;
int pos_archor_width = 1;
int pos_archor_heigh = 1;
int mat_width;
int mat_heigh;
int kernel_width = 3;
int kernel_heigh = 3;
const Vec3b& getAvg(Mat in, int **kernel, int pos_heigh, int pos_width)
{
    int temp_width_kernel_start, temp_width_kernel_end;
    int temp_heigh_kernel_start, temp_heigh_kernel_end;
    if (pos_width >= pos_archor_width)
        temp_width_kernel_start = 0;
    else
        temp_width_kernel_start = pos_archor_width - pos_width;
    if (mat_width - 1 - pos_width >= kernel_width - 1 - pos_archor_width)
        temp_width_kernel_end = kernel_width - 1;
    else
        temp_width_kernel_end = mat_width - 1 - pos_width + pos_archor_width;
    if (pos_heigh >= pos_archor_heigh)
        temp_heigh_kernel_start = 0;
    else
        temp_heigh_kernel_start = pos_archor_heigh - pos_heigh;
    if (mat_heigh - 1 - pos_heigh >= kernel_heigh - 1 - pos_archor_heigh)
        temp_heigh_kernel_end = kernel_heigh - 1;
    else
        temp_heigh_kernel_end = mat_heigh - 1 - pos_heigh + pos_archor_heigh;

    double all1 = 0;
    double all2 = 0;
    double all3 = 0;
    int x = 0;
    Vec3d vec;
    //int vec;
    int size =((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));
    //cout<<in.depth();
    for (int i = temp_heigh_kernel_start; i <= temp_heigh_kernel_end; ++i)
    {
        int y = 0;

        for (int j = temp_width_kernel_start; j <= temp_width_kernel_end; ++j)
        {
            vec = in.at<Vec3b>((pos_heigh - (pos_archor_heigh - temp_heigh_kernel_start) + x), (pos_width - (pos_archor_width - temp_width_kernel_start) + y));
            all1 += (int)vec[0];
            all2 += (int)vec[1];
            all3 += (int)vec[2] ;
            //all3 += vec;

            y++;
        }
        x++;
    }
    Vec3d tmp;
    //int tmp;
    tmp[0] = all1/size;
    tmp[1] = all2/size;
    tmp[2] = all3/size;
    //tmp = all3 / size;
    return tmp;

}

const Vec3b& getVar(Mat in, Vec3d avg/*int avg*/, int pos_heigh, int pos_width)
{
    int temp_width_kernel_start, temp_width_kernel_end;
    int temp_heigh_kernel_start, temp_heigh_kernel_end;
    if (pos_width >= pos_archor_width)
        temp_width_kernel_start = 0;
    else
        temp_width_kernel_start = pos_archor_width - pos_width;
    if (mat_width - 1 - pos_width >= kernel_width - 1 - pos_archor_width)
        temp_width_kernel_end = kernel_width - 1;
    else
        temp_width_kernel_end = mat_width - 1 - pos_width + pos_archor_width;
    if (pos_heigh >= pos_archor_heigh)
        temp_heigh_kernel_start = 0;
    else
        temp_heigh_kernel_start = pos_archor_heigh - pos_heigh;
    if (mat_heigh - 1 - pos_heigh >= kernel_heigh - 1 - pos_archor_heigh)
        temp_heigh_kernel_end = kernel_heigh - 1;
    else
        temp_heigh_kernel_end = mat_heigh - 1 - pos_heigh + pos_archor_heigh;

    double all1 = 0;
    double all2 = 0;
    double all3 = 0;
    int x = 0;
    Vec3d vec;
    //int vec;
    vec = avg;
    int size = 0;
    size = ((temp_heigh_kernel_end - temp_heigh_kernel_start+1)*(temp_width_kernel_end - temp_width_kernel_start+1));
    //cout<<in.depth();
    for (int i = temp_heigh_kernel_start; i <= temp_heigh_kernel_end; ++i)
    {
        int y = 0;

        for (int j = temp_width_kernel_start; j <= temp_width_kernel_end; ++j)
        {
            //vec = in.at<Vec3b>((pos_heigh - (pos_archor_heigh - temp_heigh_kernel_start) + x), (pos_width - (pos_archor_width - temp_width_kernel_start) + y));
            vec = in.at<Vec3b>((pos_heigh - (pos_archor_heigh - temp_heigh_kernel_start) + x), (pos_width - (pos_archor_width - temp_width_kernel_start) + y));

            //cout << vec << endl;
        //    all1 += (in.at<Vec3b>(i,j)[0]- (int)vec[0])*(in.at<Vec3b>(i, j)[0] - (int)vec[0]) / ((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));
            //all2 += (in.at<Vec3b>(i, j)[1] - (int)vec[1])*(in.at<Vec3b>(i, j)[1] - (int)vec[1])/((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));
            //all3 += (in.at<Vec3b>(i, j)[2] - (int)vec[2])*(in.at<Vec3b>(i, j)[2] - (int)vec[2]) / ((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));
            all1 += (vec[0] - avg[0])*(vec[0] - avg[0]);
            all2 += (vec[1] - avg[1])*(vec[1] - avg[1]);
            all3 += (vec[2] - avg[2])*(vec[2] - avg[2]);

            //all3 += (vec - (int)avg)*(vec - (int)avg);
            y++;
        }
        x++;
    }
    Vec3d tmp;
    //int tmp;
    //cout << size << ‘\t‘ << "all1=" << all1 << ‘\t‘ << "all2" << all2 << ‘\t‘ << "all3" << all3 << endl;
    tmp[0] = all1/size;
    tmp[1] = all2/size;
    tmp[2] = all3/size;
    //tmp = all3 / size;
    return tmp;
}
Vec3b getAllavg(Mat src)
{
    //int all = 0;

    int r = 0;
    int g = 0;
    int b = 0;
    for (int i = 0; i != src.rows; ++i)
        for (int j = 0; j != src.cols; ++j)
        {
            r += src.at<Vec3b>(i, j)[2];
            g += src.at<Vec3b>(i, j)[1];
            b += src.at<Vec3b>(i, j)[0];
        }
    Vec3b tmp;
    tmp[0] = b / (src.rows*src.cols);
    tmp[1] = g / (src.rows*src.cols);
    tmp[2] = r / (src.rows*src.cols);
    return tmp;

    //for (int i = 0; i != src.rows; ++i)
        //for (int j = 0; j != src.cols; ++j)
        //{
    //        all += src.at<uchar>(i, j);
    //    }
    //return all / src.rows / src.cols;
}

const Vec3b& getAllvar(Mat src)
{
    Vec3b avg = getAllavg(src);
    Vec3b var;
    var[0] = 0;
    var[1] = 0;
    var[2] = 0;
    for (int i = 0; i != src.rows; ++i)
        for (int j = 0; j != src.cols; ++j)
        {
            var[0] = (src.at<Vec3b>(i, j)[0] - avg[0])*(src.at<Vec3b>(i, j)[0] - avg[0]);
            var[1] = (src.at<Vec3b>(i, j)[1] - avg[1])*(src.at<Vec3b>(i, j)[1] - avg[1]);
            var[2] = (src.at<Vec3b>(i, j)[2] - avg[2])*(src.at<Vec3b>(i, j)[2] - avg[2]);
        }
    var[0]=var[0] / src.rows / src.cols;
    var[1] = var[1] / src.rows / src.cols;
    var[2] = var[2] / src.rows / src.cols;
    return var;
}

void RGB2HSI(Mat src, Mat&dst)
{
    if (src.rows != dst.rows || src.cols != dst.cols)
        return;
    double theta = 0;
    double top = 0;
    double bottom = 0;
    for (int i = 0; i != src.rows; ++i)
        for (int j = 0; j != src.cols; ++j)
        {
            //cout << i << ‘\t‘ << j << endl;
            top = 0.5*(src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[0]);
            bottom = sqrt((src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[1])*(src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[1]) + (src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[0])*(src.at<Vec3b>(i, j)[1] - src.at<Vec3b>(i, j)[0]));
            theta = acos(top / bottom);
            theta = theta * 180 / 3.14;
            if (src.at<Vec3b>(i, j)[0] > src.at<Vec3b>(i, j)[1])
                dst.at<Vec3b>(i, j)[2] = 360 - theta;
            else
                dst.at<Vec3b>(i, j)[2] = theta;
            //cout << theta << endl;
            int min = src.at<Vec3b>(i, j)[2];
            if (src.at<Vec3b>(i, j)[1] < min)
                min = src.at<Vec3b>(i, j)[1];
            if (src.at<Vec3b>(i, j)[0] < min)
                min = src.at<Vec3b>(i, j)[0];
            dst.at<Vec3b>(i, j)[1] = 1 - (3 * min / (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2]));
            dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2]) / 3;
        }
}

int main()
{
    Mat src = imread("lena.jpg");
//    GaussianBlur(src, src, Size(3, 3), 1);
//    cvtColor(src, src, CV_BGR2GRAY);
    //cvtColor(src, src, CV_BGR2HLS);
    Mat copy,keep,his,tmp;
    Mat hsi;
    src.copyTo(hsi);
    src.copyTo(his);
    cvtColor(his, his, CV_BGR2GRAY);

    RGB2HSI(hsi, hsi);
    hsi.copyTo(tmp);
    src.copyTo(keep);
    src.copyTo(copy);
    mat_heigh = src.rows;
    mat_width = src.cols;
    int **kernel = new int*[kernel_heigh];
    for (int i = 0; i != kernel_heigh; ++i)
        kernel[i] = new int[kernel_width];
    for (int i = 0; i != kernel_heigh; ++i)
        for (int j = 0; j != kernel_width; ++j)
            kernel[i][j] = 1;
    //int avg;
    Vec3d var;
    var=getAllvar(src);
    cout << var << endl;
    //cout <<"avg"<< avg << endl;
    for (int i = 0; i != src.rows; ++i)
        for (int j = 0; j != src.cols; ++j)
        {
            Vec3d tmp;
        //    int tmp;
            tmp=getAvg(src, kernel, i, j);
        //    copy.at<uchar>(i, j) = tmp+/*((0.4*avg / getVar(src,tmp, i, j))*/5*(copy.at<uchar>(i,j)-tmp);
        //    cout << tmp << endl;
            for (int k = 0; k != 3; ++k)
                hsi.at<Vec3b>(i, j)[k] = tmp[k]+(var[k]*1.1/getVar(src, tmp, i, j)[k])*(hsi.at<Vec3b>(i,j)[k]-tmp[k]);

        }
    //cvtColor(keep, keep, CV_BGR2GRAY);
    imshow("1", keep);
    //cvtColor(copy, copy,CV_BGR2GRAY);
    imshow("local", copy);
    equalizeHist(his, his);
    imshow("before_hsi", tmp);
    imshow("after_hsi", hsi);
    imshow("his", his);
    waitKey(0);
}

#include<iostream>#include<cv.hpp>#include<highgui.hpp>using namespace std;using namespace cv;int pos_archor_width = 1;int pos_archor_heigh = 1;int mat_width;int mat_heigh;int kernel_width = 3;int kernel_heigh = 3;const Vec3b& getAvg(Mat in, int **kernel, int pos_heigh, int pos_width){int temp_width_kernel_start, temp_width_kernel_end;int temp_heigh_kernel_start, temp_heigh_kernel_end;if (pos_width >= pos_archor_width)temp_width_kernel_start = 0;elsetemp_width_kernel_start = pos_archor_width - pos_width;if (mat_width - 1 - pos_width >= kernel_width - 1 - pos_archor_width)temp_width_kernel_end = kernel_width - 1;elsetemp_width_kernel_end = mat_width - 1 - pos_width + pos_archor_width;if (pos_heigh >= pos_archor_heigh)temp_heigh_kernel_start = 0;elsetemp_heigh_kernel_start = pos_archor_heigh - pos_heigh;if (mat_heigh - 1 - pos_heigh >= kernel_heigh - 1 - pos_archor_heigh)temp_heigh_kernel_end = kernel_heigh - 1;elsetemp_heigh_kernel_end = mat_heigh - 1 - pos_heigh + pos_archor_heigh;
double all1 = 0;double all2 = 0;double all3 = 0;int x = 0;Vec3d vec;//int vec;int size =((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));//cout<<in.depth();for (int i = temp_heigh_kernel_start; i <= temp_heigh_kernel_end; ++i){int y = 0;
for (int j = temp_width_kernel_start; j <= temp_width_kernel_end; ++j){vec = in.at<Vec3b>((pos_heigh - (pos_archor_heigh - temp_heigh_kernel_start) + x), (pos_width - (pos_archor_width - temp_width_kernel_start) + y));all1 += (int)vec[0];all2 += (int)vec[1];all3 += (int)vec[2] ;//all3 += vec;
y++;}x++;}Vec3d tmp;//int tmp;tmp[0] = all1/size;tmp[1] = all2/size;tmp[2] = all3/size;//tmp = all3 / size;return tmp;}
const Vec3b& getVar(Mat in, Vec3d avg/*int avg*/, int pos_heigh, int pos_width){int temp_width_kernel_start, temp_width_kernel_end;int temp_heigh_kernel_start, temp_heigh_kernel_end;if (pos_width >= pos_archor_width)temp_width_kernel_start = 0;elsetemp_width_kernel_start = pos_archor_width - pos_width;if (mat_width - 1 - pos_width >= kernel_width - 1 - pos_archor_width)temp_width_kernel_end = kernel_width - 1;elsetemp_width_kernel_end = mat_width - 1 - pos_width + pos_archor_width;if (pos_heigh >= pos_archor_heigh)temp_heigh_kernel_start = 0;elsetemp_heigh_kernel_start = pos_archor_heigh - pos_heigh;if (mat_heigh - 1 - pos_heigh >= kernel_heigh - 1 - pos_archor_heigh)temp_heigh_kernel_end = kernel_heigh - 1;elsetemp_heigh_kernel_end = mat_heigh - 1 - pos_heigh + pos_archor_heigh;
double all1 = 0;double all2 = 0;double all3 = 0;int x = 0;Vec3d vec;//int vec;vec = avg;int size = 0;size = ((temp_heigh_kernel_end - temp_heigh_kernel_start+1)*(temp_width_kernel_end - temp_width_kernel_start+1));//cout<<in.depth();for (int i = temp_heigh_kernel_start; i <= temp_heigh_kernel_end; ++i){int y = 0;
for (int j = temp_width_kernel_start; j <= temp_width_kernel_end; ++j){//vec = in.at<Vec3b>((pos_heigh - (pos_archor_heigh - temp_heigh_kernel_start) + x), (pos_width - (pos_archor_width - temp_width_kernel_start) + y));vec = in.at<Vec3b>((pos_heigh - (pos_archor_heigh - temp_heigh_kernel_start) + x), (pos_width - (pos_archor_width - temp_width_kernel_start) + y));
//cout << vec << endl;//all1 += (in.at<Vec3b>(i,j)[0]- (int)vec[0])*(in.at<Vec3b>(i, j)[0] - (int)vec[0]) / ((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));//all2 += (in.at<Vec3b>(i, j)[1] - (int)vec[1])*(in.at<Vec3b>(i, j)[1] - (int)vec[1])/((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));//all3 += (in.at<Vec3b>(i, j)[2] - (int)vec[2])*(in.at<Vec3b>(i, j)[2] - (int)vec[2]) / ((temp_heigh_kernel_end - temp_heigh_kernel_start + 1)*(temp_width_kernel_end - temp_width_kernel_start + 1));all1 += (vec[0] - avg[0])*(vec[0] - avg[0]);all2 += (vec[1] - avg[1])*(vec[1] - avg[1]);all3 += (vec[2] - avg[2])*(vec[2] - avg[2]);//all3 += (vec - (int)avg)*(vec - (int)avg);y++;}x++;}Vec3d tmp;//int tmp;//cout << size << ‘\t‘ << "all1=" << all1 << ‘\t‘ << "all2" << all2 << ‘\t‘ << "all3" << all3 << endl;tmp[0] = all1/size;tmp[1] = all2/size;tmp[2] = all3/size;//tmp = all3 / size;return tmp;}Vec3b getAllavg(Mat src){//int all = 0;int r = 0;int g = 0;int b = 0;for (int i = 0; i != src.rows; ++i)for (int j = 0; j != src.cols; ++j){r += src.at<Vec3b>(i, j)[2];g += src.at<Vec3b>(i, j)[1];b += src.at<Vec3b>(i, j)[0];}Vec3b tmp;tmp[0] = b / (src.rows*src.cols);tmp[1] = g / (src.rows*src.cols);tmp[2] = r / (src.rows*src.cols);return tmp;//for (int i = 0; i != src.rows; ++i)//for (int j = 0; j != src.cols; ++j)//{//all += src.at<uchar>(i, j);//}//return all / src.rows / src.cols;}
const Vec3b& getAllvar(Mat src){Vec3b avg = getAllavg(src);Vec3b var;var[0] = 0;var[1] = 0;var[2] = 0;for (int i = 0; i != src.rows; ++i)for (int j = 0; j != src.cols; ++j){var[0] = (src.at<Vec3b>(i, j)[0] - avg[0])*(src.at<Vec3b>(i, j)[0] - avg[0]);var[1] = (src.at<Vec3b>(i, j)[1] - avg[1])*(src.at<Vec3b>(i, j)[1] - avg[1]);var[2] = (src.at<Vec3b>(i, j)[2] - avg[2])*(src.at<Vec3b>(i, j)[2] - avg[2]);}var[0]=var[0] / src.rows / src.cols;var[1] = var[1] / src.rows / src.cols;var[2] = var[2] / src.rows / src.cols;return var;}

void RGB2HSI(Mat src, Mat&dst){if (src.rows != dst.rows || src.cols != dst.cols)return;double theta = 0;double top = 0;double bottom = 0;for (int i = 0; i != src.rows; ++i)for (int j = 0; j != src.cols; ++j){//cout << i << ‘\t‘ << j << endl;top = 0.5*(src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[0]);bottom = sqrt((src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[1])*(src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[1]) + (src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i, j)[0])*(src.at<Vec3b>(i, j)[1] - src.at<Vec3b>(i, j)[0]));theta = acos(top / bottom);theta = theta * 180 / 3.14;if (src.at<Vec3b>(i, j)[0] > src.at<Vec3b>(i, j)[1])dst.at<Vec3b>(i, j)[2] = 360 - theta;elsedst.at<Vec3b>(i, j)[2] = theta;//cout << theta << endl;int min = src.at<Vec3b>(i, j)[2];if (src.at<Vec3b>(i, j)[1] < min)min = src.at<Vec3b>(i, j)[1];if (src.at<Vec3b>(i, j)[0] < min)min = src.at<Vec3b>(i, j)[0];dst.at<Vec3b>(i, j)[1] = 1 - (3 * min / (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2]));dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2]) / 3;}}
int main(){Mat src = imread("lena.jpg");//GaussianBlur(src, src, Size(3, 3), 1);//cvtColor(src, src, CV_BGR2GRAY);//cvtColor(src, src, CV_BGR2HLS);Mat copy,keep,his,tmp;Mat hsi;src.copyTo(hsi);src.copyTo(his);cvtColor(his, his, CV_BGR2GRAY);RGB2HSI(hsi, hsi);hsi.copyTo(tmp);src.copyTo(keep);src.copyTo(copy);mat_heigh = src.rows;mat_width = src.cols;int **kernel = new int*[kernel_heigh];for (int i = 0; i != kernel_heigh; ++i)kernel[i] = new int[kernel_width];for (int i = 0; i != kernel_heigh; ++i)for (int j = 0; j != kernel_width; ++j)kernel[i][j] = 1;//int avg;Vec3d var;var=getAllvar(src);cout << var << endl;//cout <<"avg"<< avg << endl;for (int i = 0; i != src.rows; ++i)for (int j = 0; j != src.cols; ++j){Vec3d tmp;//int tmp;tmp=getAvg(src, kernel, i, j);//copy.at<uchar>(i, j) = tmp+/*((0.4*avg / getVar(src,tmp, i, j))*/5*(copy.at<uchar>(i,j)-tmp);//cout << tmp << endl;for (int k = 0; k != 3; ++k)hsi.at<Vec3b>(i, j)[k] = tmp[k]+(var[k]*1.1/getVar(src, tmp, i, j)[k])*(hsi.at<Vec3b>(i,j)[k]-tmp[k]);
}//cvtColor(keep, keep, CV_BGR2GRAY);imshow("1", keep);//cvtColor(copy, copy,CV_BGR2GRAY);imshow("local", copy);equalizeHist(his, his);imshow("before_hsi", tmp);imshow("after_hsi", hsi);imshow("his", his);waitKey(0);}

时间: 2024-12-16 16:08:19

局部增强的相关文章

图像处理复习1——图像基础和空域增强

图像处理复习 CH2 图像基础 2.1 噪声 噪声定义为妨碍人们感觉器官对所接收的信源信息理解的因素,噪声有以下几个常见分类: (1)按统计理论分类 平稳噪声:统计特性不随时间变化 非平稳噪声:统计特性随时间变化 (2)按频谱形状分类 白噪声:频谱均匀分布 三角噪声:频谱与频率平方成正比 (3)按幅度分布形状分类:高斯噪声.雷利噪声 (4)按噪声与信号关系分类:加性噪声.乘性噪声 处理噪声时往往假设噪声是加性噪声并且噪声和信号是相互统计独立的 2.2 成像基础模型 假设投影成像有以下模型: 则由

17.5.11 自己领悟

1.为什么局部连接? 局部感受野,局部连接可以学到边缘.端点等特征,然后经过CNN的逐层局部连接又可以讲这些组合得到主键抽象的高层特征 2.为什么权值共享? 为了学到图像的不同位置的相同类型的特征,比如学到斜线?直线?等,有效减少参数数目,比起全连接的网络模型也更加泛化? 2a,权值共享体现在哪里? 每个filter 要 全部走完整幅图像 2b,比方说有m层的输出为96个特征图,则需要96个filter,然而每个filter并不是单纯的为一张二维卷积滤波图,而是卷积核:即输入有几个通道,则这个卷

数字图像处理的Matlab实现(4)—灰度变换与空间滤波

第3章 灰度变换与空间滤波(2) 3.3 直方图处理与函数绘图 基于从图像亮度直方图中提取的信息的亮度变换函数,在诸如增强.压缩.分割.描述等方面的图像处理中扮演着基础性的角色.本节的重点在于获取.绘图并利用直方图技术进行图像增强.直方图的其他应用将在后续章节中加以介绍. 3.3.1 生成并绘制图像的直方图 一幅数字图像在范围[0,G]内总共有L个灰度级,其直方图定义为离散函数: \[ h(r_k)=n_k \] 其中,\(r_k\)是区间[0,G]内的第k级亮度,\(n_k\)是灰度级为\(r

深入学习图像处理——图像相似度算法

最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜索的流程整理一下,想到什么说什么吧. 首先在进行图片灰度化处理之前,我觉得有必要了解一下为什么要进行灰度化处理. 图像灰度化的目的是什么? 将彩色图像转化为灰度图像的过程是图像的灰度化处理.彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多

【论文阅读】Second-order Attention Network for Single Image Super-Resolution

概要 近年来,深度卷积神经网络(CNNs)在单一图像超分辨率(SISR)中进行了广泛的探索,并获得了卓越的性能.但是,大多数现有的基于CNN的SISR方法主要聚焦于更宽或更深的体系结构设计上,而忽略了挖掘层间特征的内在相关性,从而阻碍了CNN的表示能力.为了解决这一问题,在本文中提出了一个二阶注意力网络(SAN),用于更强大的特征表达和特征相关性学习.特别地,开发了一种新颖的可训练的二阶通道注意力(SOCA)模块,以通过使用二阶特征统计量进行更具区分度的表示来自适应地重缩放通道级别的特征.此外,

数字图像处理(二) 灰度变换与空域滤波

一.引入 空间域方法:对像素操作的过程->对图像像素直接处理. 空间域处理可由该式定义: \(g(x,y)=T[f(x,y)]\) 其中,f(x,y)为原图像,g(x,y)为处理后的图像,T为定义在x,y的邻域(不一定是4/8/m邻域,可能是更大的范围,如3x3,5x5的mask,et al)内的一个操作(也叫做算子). 最小邻域的大小为1x1,在这种情况下,g(x,y)仅取决于对应的f(x,y)值,上式可变换为一个形如下式的灰度(级)变换函数/灰度映射函数: \(s=T(r)\) 其中,r和s

[blogs 算法原理 ]局部标准差实现对比度增强

基于“局部标准差”的图像增强(原理.算法.代码) 一.理论 图像增强算法的基本原则是“降低低频区域,突出高频区域”,以此强化边缘,达到增强的目的.最简单的例子就是通过原始图像减去高斯模糊处理后的图像,就能够将边缘强化出来. 直方图均衡化也是一种非常常见的增强方法.但是为了避免背景的干扰,更倾向于采用“局部”方法进行处理.我们这里着重研究自适应对比度增强(ACE)的相关内容. ACE的定义和原理(TODO) ACE算法的相关内容: 计算低频成分: 对于具体的像素,一般可以通过计算以该像素为中心的局

增强学习 | Q-Learning

"价值不是由一次成功决定的,而是在长期的进取中体现" 上文介绍了描述能力更强的多臂赌博机模型,即通过多台机器的方式对环境变量建模,选择动作策略时考虑时序累积奖赏的影响.虽然多臂赌博机模型中引入了价值的概念,但方法在建模过程中本质上是以策略为优化目标,因此又常被归为基于策略的增强学习方法. 此外,增强学习方法还有基于价值以及基于模型两类主要方法.本文介绍第二类,先从描述价值目标的Q函数开始,它也常称之为Q-Learning方法. 最简单的Q函数可用"状态-动作"二维表

【幻化万千戏红尘】qianfengDay10-java基础学习:成员内部类、静态内部类、局部和匿名内部类,设计模式之简单工厂模式

课程回顾: 接口:1.属性:public\static\final2.方法:public\abstract 多态:1.静态化(编译时)多态重载2.动态化(运行时)多态重写对象转型 1.向上转型 2.向下转型 今日内容:内部类:定义在类的内部的类1.成员内部类格式:[修饰符] class 类名 { }内部不能有静态的属性和方法,可以访问外部类的属性,也可以调用外部类的方法 在静态方法中的使用格式:外部类 外对象=new 外部类();成员内部类 对象名=外对象.new 成员内部类(); 2.静态内部