算法思路
分离RGB通道
之后对各通道均衡化处理
再合并到一起
public Mat equalizeRGBHist(Mat mat){ //传入Mat类返回Mat类
int height=mat.rows();
int width=mat.cols();
int channels=mat.channels();
byte[] values= new byte[height*width*channels];
byte[] values_RGB= new byte[height*width];
mat.get(0,0,values);
Mat desMat = new Mat(height, width, CV_8UC4);
Mat rgbMat = new Mat(height, width, CV_8UC1); //这里没有初始化各通道是因为手机内存不够
for(int i=0; i<values.length;i++){ //对R通道进行处理
if(i%4==0) {
values_RGB[i / 4] = values[i];
}
}
rgbMat.put(0,0,values_RGB); //获取R通道后转成Mat
equalizeHist(rgbMat,rgbMat);//用OpenCV内置函数equalizeHist() 对单通道的Mat进行均衡化
rgbMat.get(0,0,values_RGB); //均衡化后获取所有像素值对原Mat进行更改
for(int i=0; i<values.length;i++){
if(i%4==0) {
values[i]=values_RGB[i/4];
}
}
for(int i=0; i<values.length; i++){ //对G通道进行处理
if(i%4==1) {
values_RGB[i/4] = values[i];
}
}
rgbMat.put(0,0,values_RGB);
equalizeHist(rgbMat,rgbMat);
rgbMat.get(0,0,values_RGB);
for(int i=0; i<values.length;i++){
if(i%4==1) {
values[i]=values_RGB[i/4];
}
}
for(int i=0; i<values.length; i++){ //对B通道进行处理
if(i%4==2) {
values_RGB[i/4] = values[i];
}
}
rgbMat.put(0,0,values_RGB);
equalizeHist(rgbMat,rgbMat);
rgbMat.get(0,0,values_RGB);
for(int i=0; i<values.length;i++){
if(i%4==2) {
values[i]=values_RGB[i/4];
}
}
desMat.put(0,0,values);
rgbMat.release();
return desMat;
}