精华内容
下载资源
问答
  • 一种快速灰度校正方法,方法来自论文:[1]高建贞,任明武,杨静宇.一种快速实用的灰度校正算法[J].中国图象图形学报,2002(06):30-34. MATLAB代码:经MATLAB R2019a实现。
  • 一种快速实用的灰度校正算法[J].中国图象图形学报,2002(06):30-34. MATLAB代码:经MATLAB R2019a实现 一、步骤详解 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1...


    前言

    方法来源:[1]高建贞,任明武,杨静宇.一种快速实用的灰度校正算法[J].中国图象图形学报,2002(06):30-34.
    MATLAB代码:经MATLAB R2019a实现。
    程序小白,代码有不合理的地方望指正。


    一、MATLAB代码

    MATLAB代码如下:

    clc;clear;close all
    im=imread('企鹅.jpg');
    im= rgb2gray(im);
    figure
    imshow(im)          %企鹅灰度图像
    
    [m,n]=size(im);     %原图的尺寸
    blocksize=8;        %分块大小,此处块为正方形,方便后面差值运算
    %分块处理
    blocknum1 =floor(m/blocksize);    %分块数量(对应图像长度,即m),取整后,原图会剩下几个像素的长或宽未做处理
    blocknum2 =floor(n/blocksize);    %分块数量(对应图像宽度,即n)
    length =blocknum1*blocksize;   %处理的长度像素数
    height =blocknum2*blocksize;   %处理的宽度像素数
    A=zeros(blocknum1,blocknum2) ;
    ff = im(1:length,1:height);     %生成一个用来原图副本(去除多余像素的)
    %开始分块处理
    for k = 1:blocknum2
        for h = 1:blocknum1
        
            %生成模板
            block = zeros(size(ff));    %将模板初始化为0
            lini = 1 + blocksize * (h - 1);
            hini = 1 + blocksize * (k - 1);     %分块的第一个像素在原图中的坐标
            x = lini:(lini + blocksize - 1);
            y = hini:(hini + blocksize - 1);    %生成分块长、宽坐标序列
            block(x, y) = 1;                     %将模板上需要进行分块的部分转换成1,用来提取该分块
            
            %提取分块
            ff = im2double(ff);     %原图转换为double类型,保证和模板black同类型以做点乘
            block = block .* ff;    %将原图投影在模板上
            block = block(x, y);    %提取分块
            %%%%%%%%%%%%%%%%对块进行处理%%%%%%%%%%%%%%%%%%%%%%%
            a=blocksize * blocksize;   %块的像素总数
            B=reshape(block,[1,a]);    %将块的矩阵中的数重新排列为一行a列的一维矩阵
            C=sort(B,'ascend');        %对矩阵B进行升序排列,即从小到大排列
            b=floor(a/4);              %b为一维矩阵1/4处的长度
            D=C(1,b:a) ;               %D为一维矩阵后3/4的部分
            A(h,k)=mean(D);            %A(h,k)为D的平均值,A为背景模板矩阵
        end
    end
     A=im2uint8(A);
     A=imblizoom(A,blocksize);    %对A进行差值放大,放大后的矩阵与ff一样,此时为图像背景矩阵
     I0=im2double(A);             %I0为背景矩阵
     I1=im2double(im);            %原图矩阵变为double类型
     c=0.7;          %系数可调
     I=zeros(length,height);                %定义I,提高运算速度
     for i=1:length
         for j=1:height
             I(i,j)=I1(i,j)*c/I0(i,j);   %灰度校正公式
         end
     end
    im1=im2uint8(I);  %结果是去掉多余像素的,可以加回来,但多余像素未作处理
    figure
    imshow(im1)
    imwrite(im1,'0.7.jpg')
    

    其中块的大小blocksize以及系数c可调。


    子函数:imblizoom

    function [ ZI ] = imblizoom( I,zmf )
    %----------------------双线性插值法缩放矩阵或图像---------------------------
    %       I:图像文件名或矩阵(整数值(0~255))
    %       zmf:缩放因子,即缩放的倍数
    %       缩放后的图像矩阵 ZI
    
    
    if ~exist('I','var') || isempty(I)
        error('输入图像 I未定义或为空!');
    end
    if ~exist('zmf','var') || isempty(zmf) || numel(zmf) ~= 1
         error('位移矢量 zmf未定义或为空或 zmf中的元素超过2!');
    end
    if isstr(I)
        [I,M] = imread(I);
    end
    if zmf <= 0
         error('缩放倍数 zmf的值应该大于0!');
    end
    
    
    [IH,IW,ID] = size(I);
    ZIH = round(IH*zmf); 
    ZIW = round(IW*zmf); 
    ZI = zeros(ZIH,ZIW,ID); 
    
    
    
    IT = zeros(IH+2,IW+2,ID);
    IT(2:IH+1,2:IW+1,:) = I;
    IT(1,2:IW+1,:)=I(1,:,:);IT(IH+2,2:IW+1,:)=I(IH,:,:);
    IT(2:IH+1,1,:)=I(:,1,:);IT(2:IH+1,IW+2,:)=I(:,IW,:);
    IT(1,1,:) = I(1,1,:);IT(1,IW+2,:) = I(1,IW,:);
    IT(IH+2,1,:) = I(IH,1,:);IT(IH+2,IW+2,:) = I(IH,IW,:);
    
    
    
    for zj = 1:ZIW         
        for zi = 1:ZIH
            ii = (zi-1)/zmf; jj = (zj-1)/zmf;
            i = floor(ii); j = floor(jj); 
            u = ii - i; v = jj - j;
            i = i + 1; j = j + 1;
            ZI(zi,zj,:) = (1-u)*(1-v)*IT(i,j,:) +(1-u)*v*IT(i,j+1,:) + u*(1-v)*IT(i+1,j,:) +u*v*IT(i+1,j+1,:);
        end
    end
    ZI = uint8(ZI);
    end  
    

    二、结果示例

    在这里插入图片描述


    总结

    方法来源:[1]高建贞,任明武,杨静宇.一种快速实用的灰度校正算法[J].中国图象图形学报,2002(06):30-34.

    展开全文
  • 由于实际视觉检测系统的光照、摄像、传感器灵敏度,以及光学系统等的不均匀性,图像处理过程中在进行质量检测和自动分级时,采集的图像会产生失真的...结果证明了基于OpenCV的两种图像预处理方法对图像灰度校正的有效性。
  • 光学4f系统的灰度校正
  • 摘 要 介绍了光学成像系统灰度衰减模型= 提出了一种快速的灰度不均图象校正方法该方法不需要其他的外 部参数= 也不需要模型= 仅通过对灰度不均的图象自身进行运算来加以校正= 它基于通过原图象减去背景图象来消 除...
  • 行业分类-物理装置-基于复合编码三维重建的散斑灰度校正方法和装置.zip
  • wholecore批量灰度校正

    2021-08-03 21:28:37
    wholecore批量灰度校正 import os import easygui as g from tkinter import * from tkinter import messagebox class Application(Frame): def __init__(self, master=None): super().__init__(master) # super...

    wholecore批量灰度校正

    import os
    import easygui as g
    from tkinter import *
    from tkinter import messagebox
    
    class Application(Frame):
        def __init__(self, master=None):
            super().__init__(master)  # super()代表的是父类的定义,而不是父类对象
            self.master = master
            self.pack()
            self.createWidget()
    
        def createWidget(self):
            """创建输入界面的组件"""
            self.label01 = Label( self, text="灰度值_Min")
            self.label01.pack()
            # StringVar 变量绑定到指定的组件。
            # StringVar 变量的值发生变化,组件内容也变化;
            # 组件内容发生变化,StringVar 变量的值也发生变化。
            v1 = StringVar()
            self.entry01 = Entry( self, textvariable=v1)
            self.entry01.pack()
            v1.set("")
            print( v1.get())
            print( self.entry01.get())
            self.label02 = Label( self, text="灰度值_Max")
            self.label02.pack()
            v2 = StringVar()
            self.entry02 = Entry( self, textvariable=v2)
            self.entry02.pack()
            v2.set("")
    
            Button( root, text="批量校正", command=self.login).place(x=130, y=90)
            Button( root, text="单个校正", command=self.login2).place(x=210, y=90)
    
    
    
        def login(self):
            username = self.entry01.get()
            pwd = self.entry02.get()
            print(username)
            print(pwd)
            if int(pwd) < int(username):
                messagebox.showinfo("提示", "最小值与最大值输入有误,请重新输入!!!")
            else:
                pass
    
            length = int(pwd) - int(username)  # length值计算
            middle = int((length / 2)) + int(username)  # middle值计算
            self.length = length
            self.middle = middle
            print(length)
            print(middle)
    
    
            path = g.diropenbox()
            print(path)
            file_name = []
            for i in os.walk(path):
                file_name.append(i)
            file_name_list = file_name[0][1]
            print(file_name)
            print( file_name_list)
    
            abs_path = path  # E:\Users\0\Desktop\2021-7-3      print(abs_path)
            file_path = file_name_list  # ['WYD1#_1_1_100cm', 'WYD1#_1_2_11cm', 'WYD1#_2_1_83cm']        print(file_path)
    
            for f in file_path:
                path1 = f + '.wholecore'  # WYD1#_1_1_100cm.wholecore    print(path1)
                path2 = os.path.join( '%s', '%s', '%s' % abs_path, f, path1)  # E:\Users\0\Desktop\2021-7-3\WYD1#_1_1_100cm\WYD1#_1_1_100cm.wholecore
                with open( path2, mode='r', encoding='utf-8') as f1, open( path2 + '_副本', mode='w', encoding='utf-8') as f2:
                    a = f1.readlines()
                    b = a[13].split( '>' )[1].split( '<' )[0]
                    b = str( middle )
                    c = "  <WindowCenter>%s</WindowCenter>\n" % b
                    a[13] = c
                    f2.writelines( a )
                os.remove( path2 )
                with open( path2 + '_副本', mode='r', encoding='utf-8') as f3, open( path2, mode='w', encoding='utf-8') as f4:
                    a1 = f3.readlines()
                    b1 = a1[14].split( '>' )[1].split( '<' )[0]
                    b1 = str( length )
                    c1 = "  <WindowWidth>%s</WindowWidth>\n" % b1
                    a1[14] = c1
                    f4.writelines( a1 )
                os.remove( path2 + '_副本')
            for i in file_path:
                openp = abs_path +'\\' + i +'\\Viewer'
                print(openp)
                os.system('%s' % openp)
    
            messagebox.showinfo( "提示", "%s 井wholecore数据灰度值全部校正完成!!!" % path)
    
        def login2(self):
            username = self.entry01.get()
            pwd = self.entry02.get()
            print( username )
            print( pwd )
            if int(pwd) < int(username):
                messagebox.showinfo( "提示", "最小值与最大值输入有误,请重新输入!!!")
    
            else:
                pass
    
            length = int( pwd ) - int( username )  # length值计算
            middle = int( (length / 2) ) + int( username )  # middle值计算
            self.length = length
            self.middle = middle
            print( length )
            print( middle )
    
            strl = g.fileopenbox('open file')
            print( strl )
            strl_new = strl.split( "\\" )
            print( strl_new )
    
            strllist = strl_new[-1]
            print( strllist )
            path = strllist[:-1]
            strllist2 = strl_new[:-1]
            print(strllist2)
            openpath = strl.replace(strllist, 'Viewer')
            print(openpath)
    
    
            # 7.替换 wholecore文件中的默认灰度值
            with open( strl, mode="r", encoding="utf-8" ) as f1, \
                    open( "strl_副本", mode="w", encoding="utf-8" ) as f2:
                a = f1.readlines()
                b = a[13].split( '>' )[1].split( '<' )[0]
                b = str( middle )
                c = "  <WindowCenter>%s</WindowCenter>\n" % b
                a[13] = c
                f2.writelines( a )
            os.remove( strl )  # 删除文件
    
            with open( "strl_副本", mode="r", encoding="utf-8") as f3, \
                    open( strl, mode="w", encoding="utf-8") as f4:
                a1 = f3.readlines()
                b1 = a1[14].split( '>' )[1].split( '<' )[0]
                b1 = str( length )
                c1 = "  <WindowWidth>%s</WindowWidth>\n" % b1
                a1[14] = c1
                f4.writelines( a1 )
    
            os.remove( "strl_副本" )  # 删除文件
            messagebox.showinfo( "提示", "%s 井wholecore数据灰度值全部校正完成!!!" % path )
            os.system('%s' % openpath)
    
    
    if __name__ == '__main__':
              
        root = Tk()
        root.geometry( "400x130+200+300")
        root.title( "灰度值校正2.0版")
        app = Application(master=root)
        root.mainloop()
    
    

    以下是UI效果图
    在这里插入图片描述

    展开全文
  • 改进灰度世界颜色校正算法
  • 基于完美反射和灰度世界的试纸颜色校正与识别方法.pdf
  • 可以对非均匀光照下的图像进行补偿的一种很有效的算法
  • 借用gamma校正的方法来调整图片(灰度)亮度(解决侧光问题)并将其再次保存为RGB图片

    近期在图片处理环节的时候,遇见了一个调整图片亮度的问题,这里需要调整整个图片的亮度,使得整体亮度较为均匀,根据网上查找,我最后确定使用gamma校正的方法来完成这个任务。

    首先需要知道gamma校正是什么原理:

    简单来说,也就是调整一个参数,对图片中的每个像素根据这个gamma参数做出调整,而这个调整

    的原理就是原像素的灰度值的gamma次方,所以就可以解释图片中的三个结果了,当gamma小于1的时

    候,很明显a^gamma > a(a<1, a是通过运算得到a = gray / 255.0),这样就会让整体的亮度提升,并且

    也可以预见到,当像素的灰度值越低(暗),运算的结果就越明显,而比较亮的部分(灰度值比较高)

    的整体的提升就比较少。同样的对于gamma大于1的时候就就会有相反的效果。

    下面贴出我们的代码:

    #-*-coding: UTF-8-*-
    import numpy as np
    import cv2
    import math
    from matplotlib import pyplot as plt
    #import Recognise
    
    #读取图片
    img = cv2.imread('5.jpg')
    #将原图片(RGB)转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #显示并保存
    cv2.imshow('gray', gray)
    cv2.imwrite('gray.jpg', gray)
    #将灰度图做gamma校正运算
    image = np.power(gray/255.0, 1/2.2)
    cv2.imshow('imagechange', image)
    
    #由于后面需要进行类型转换,转换成uint8,所以需要对其乘以255处理
    image = image * 255
    
    cv2.imwrite('imagechange.jpg',image)
    #这里需要将image->转换为uint8类型,因为会出现类型不匹配
    gray2rgb = cv2.cvtColor(image.astype(np.uint8), cv2.COLOR_GRAY2RGB)
    #保存图片
    cv2.imwrite('gray2rgb.jpg', gray2rgb)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    原图

    5.jpg gray.jpg gray2rgb.jpg imagechange.jpg


    展开全文
  • Delphi图像处理灰度化、二值化、滤波,Delphi开发,简单实用
  • 图像灰度变换及实现

    2019-09-16 13:57:44
    灰度变换是空间域图像处理技术中最基础的技术,常用的转换有图像反转、对数变换和伽马(幂律)变换。 图像反转 图像反转的原理很简单,就是颠倒黑白的运算,处理后的效果看起来像是原图的底片,对于一个8bit的灰度...

    灰度变换是空间域图像处理技术中最基础的技术,常用的转换有图像反转、对数变换和伽马(幂律)变换。


    图像反转


    图像反转的原理很简单,就是颠倒黑白的运算,处理后的效果看起来像是原图的底片,对于一个8bit的灰度图像,变换公式为:


    s=255-1-r;


    opencv实现:

    #include <opencv2/highgui/highgui.hpp>
    
    using namespace cv; 
    
    int main(int argc,char *argv[])  
    {  
    	Mat image=imread(argv[1],0);
    	Mat imageDst=~image; //图像反转
    	imshow("Source Image",image);
    	imshow("Reversal Image",imageDst);	
    	waitKey();
    	return 0;  
    }


    Opencv重载了“~”操作符,~image就可以返回image的反转图像。下图可以看到,黑的部分变白,白的部分变黑了。

        


    对数变换


    对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:



    对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:



    x轴的0.4大约对应了y轴的0.8,即原图上0~0.4的低灰度部分经过对数运算后扩展到0~0.8的部分,而整个0.4~1的高灰度部分被投影到只有0.8~1的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。

    从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。


    Opencv实现:

    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/imgproc/imgproc.hpp>  
    #include <opencv2/core/core.hpp> 
    
    using namespace cv; 
    
    int main(int argc,char *argv[])  
    {  
    	Mat image=imread(argv[1]);
    	Mat imageLog(image.size(),CV_32FC3);
    	for(int i=0;i<image.rows;i++)
    	{
    		for(int j=0;j<image.cols;j++)
    		{
    			imageLog.at<Vec3f>(i,j)[0]=log(1+image.at<Vec3b>(i,j)[0]);
    			imageLog.at<Vec3f>(i,j)[1]=log(1+image.at<Vec3b>(i,j)[1]);
    			imageLog.at<Vec3f>(i,j)[2]=log(1+image.at<Vec3b>(i,j)[2]);			
    		}
    	}
    	//归一化到0~255
    	normalize(imageLog,imageLog,0,255,CV_MINMAX);
    	//转换成8bit图像显示
    	convertScaleAbs(imageLog,imageLog);
    	imshow("Soure",image);
    	imshow("after",imageLog);
    	waitKey();
    	return 0;  
    }

    低灰度部分扩展效果:

         


    从右图可以看到,低灰度部分如楼房、天空、树叶部分的像素值得到了扩展,可以看到更多的细节。所以对数变换对照度不均图像中低灰度部分的细节增强很实用。


    伽马变换


    伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:



    伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:



    γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。


    Opencv实现:

    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/imgproc/imgproc.hpp>  
    #include <opencv2/core/core.hpp> 
    
    using namespace cv; 
    
    int main(int argc,char *argv[])  
    {  
    	Mat image=imread(argv[1]);
    	Mat imageGamma(image.size(),CV_32FC3);
    	for(int i=0;i<image.rows;i++)
    	{
    		for(int j=0;j<image.cols;j++)
    		{
    			imageGamma.at<Vec3f>(i,j)[0]=(image.at<Vec3b>(i,j)[0])*(image.at<Vec3b>(i,j)[0])*(image.at<Vec3b>(i,j)[0]);
    			imageGamma.at<Vec3f>(i,j)[1]=(image.at<Vec3b>(i,j)[1])*(image.at<Vec3b>(i,j)[1])*(image.at<Vec3b>(i,j)[1]);
    			imageGamma.at<Vec3f>(i,j)[2]=(image.at<Vec3b>(i,j)[2])*(image.at<Vec3b>(i,j)[2])*(image.at<Vec3b>(i,j)[2]);				
    		}
    	}
    	//归一化到0~255
    	normalize(imageGamma,imageGamma,0,255,CV_MINMAX);
    	//转换成8bit图像显示
    	convertScaleAbs(imageGamma,imageGamma);
    	imshow("Soure",image);
    	imshow("Gamma Trans",imageGamma);
    	waitKey();
    	return 0;  
    }


    原图是一张有点过曝的图像,高灰度部分的细节不清楚,通过伽马变换扩展高灰度部分,增强对比度:



    伽马变换效果:



    转载于:https://my.oschina.net/abcijkxyz/blog/787669

    展开全文
  • 局部颜色校正

    千次阅读 2018-07-13 22:18:34
    局部颜色校正原理我们将介绍一种局部颜色校正的技术,用以提高数字图像的对比度。当图像整体太暗或太亮的时候,我们可以使用Gamma校正的技术提高图像的对比度。图一 从左至右:分别是较暗原始图像,Gamma系数为0.5的...
  • 自动伽马校正(Auto Gamma Correction)算法

    千次阅读 2020-12-09 20:52:30
    自动伽马校正(Auto Gamma Correction)算法 目录 文章目录自动伽马校正(Auto Gamma Correction)算法目录理论代码实现参考资料 理论 在对图像进行处理过程中,查找到一篇对图像进行自动gamma校正的论文,论文名称及...
  • 在MATLAB中,通过函数imadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵,该函数调用格式如下: J=imadjust( I ) 对图像I进行灰度调整,对比度默认拉伸 将灰度图像 I 中的亮度值映射到 ...
  • Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: 伽玛校正由以下幂律表达式定义: 2.函数原型 void calcHist( const Mat* images, int nimages, const int...
  • Gamma校正是一种重要的非线性变换,其是对输入图像灰度值进行指数变换,进而校正亮度偏差,通常应用于扩展暗调的细节。一般情况下,当Gamma校正的值大于1时,图像的高光部分被压缩而暗调部分被扩展;当Gamma矫正小于...
  • 用MATLAB实现图像灰度级修正,包括线性分段变换,反转变换,gamma变换及直方图均衡化处理。附matlab代码。
  • (1)虹膜定位过程中,采取了自适应...(3)在徐露等提出的基于灰度曲面匹配的虹膜识别算法的基础上,对其进行 了改进,减少了匹配平移次数,提高了虹膜识别的速度;提出了分区域加权求 均方差的方法,提高了虹识别的精度。
  • 基于图像灰度特征的QR码图像校正研究
  • gamma校正(基于OpenCV)

    千次阅读 2017-10-25 18:39:10
    Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。 指数γ即为Gamma 经过Gamma校正后的输入和输出图像灰度值关系如下图所示: 横坐标是输入灰度值,纵坐标...
  • 一种应用于线阵CCD 图像灰度分布校正方法,能够快速有效的提高线阵CCD 图像质量。
  • 人脸光照调整之Gamma校正

    千次阅读 2015-07-07 15:10:15
    从以上效果可以发现,改进后Gamma校正的难点是Gamma校正参数的确定,其优点是在采用相同参数的情况下,其校正灰度变化是相等的。加入“微调”可以减小不同Gamma参数对结果的影响权重,从而使得人脸图像的灰度更...
  • gamma 校正理解及python实现

    千次阅读 2017-06-13 16:01:35
    1.什么是Gamma校正? Gamma源于早期的CRT显示器的响应曲线,也就是输出亮度和输入电压的非线性关系,如图所示: 图1 亮度和输入电压的非线性关系图   由图可以看出,亮度和输入电压的关
  • 文档图像倾斜角检测及校正(一); 霍夫变换原理; Matlab程序; 阅读之前注意: Hi,你好,我是Cooper Liu,欢迎来到我写的“文档图像校正”系列博客。基于三种原理,我写了四个实验性的...
  • 关于论文《光照不均匀图像的灰度波动局部阈值分割》最近遇到了需要处理图像上光照不晕的问题,参考了论文《光照不均匀图像的灰度波动局部阈值分割》的方法,觉得它的效果很好,对图像的分析也比较到位。实际尝试以后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,959
精华内容 3,583
关键字:

灰度校正