OpenCV之像素訪問(2)

通過指針訪問圖像數據

(1)通過uchar *data=src.ptr<uchar>(line_number);獲取所要處理的像素點所在行數

(2)data[i]就可以獲得圖像中某一行中第j行、第i/3個像素的第i%3通道的灰度值,其中:
0=<i<image.cols*image.channels()

例程 :Color Reduce算法

#include"opencv2/highgui/highgui.hpp"

#include"opencv2/core/core.hpp"
#include<iostream>
usingnamespacecv;
usingnamespacestd;
voidcolorReduce1(Mat&image,intdiv=64) {
intnl=image.rows;
intnc=image.cols*image.channels();
for(intj=0;j<nl;j++) {
uchar*data=image.ptr<uchar>(j);
for(inti=0;i<nc;i++) {
data[i]=data[i]/div*div+div/2;
}
}
}
int_tmain(intargc,_TCHAR*argv[])
{
Matsrc=imread("D:\\1.jpg");
Matoutput;
src.copyTo(output);
if(!src.data)
{
cout<<"Image loading failed"<<endl;
}
colorReduce1(output,32);
namedWindow("src",WINDOW_AUTOSIZE);
namedWindow("output",WINDOW_AUTOSIZE);
imshow("output",output);
imshow("src",src);
waitKey(0);
return0;
}
程序運行結果:
如果div的數目爲2的整數冪,則還可以通過移位預算,增加程序的執行效率,修改後代碼如下:
voidcolorReduce2(Mat&image,intn=6) {
intnl=image.rows;
intnc=image.cols*image.channels();
intdiv= (int)pow(2.0f,n);
ucharmask= 0xFF<<n;//與mask進行與運算,相當於對低n位進行清零
for(intj=0;j<nl;j++) {
uchar*data=image.ptr<uchar>(j);
for(inti=0;i<nc;i++) {
data[i]= (data[i]&mask) + div/2;
}
}
}
爲了進一步提高執行效率,可以通過isContinuous方法來判斷圖像是否爲連續圖像,如果返回值是TRUE,則代表其是連續圖像,對於連續圖像而言,在圖像像素掃描時的雙層循環改爲單層循環,進一步提高執行效率
voidcolorReduce3(Mat&image, intn=6) {
intnl= image.rows;
intnc= image.cols* image.channels();
intdiv = (int)pow(2.0f,n);
ucharmask = 0xFF<<n;
if(image.isContinuous())
{
nc=nl*nc;
nl=1;
}
for(int j=0;j<nl;j++)
{
uchar*data= image.ptr<uchar>(j);
for(int i=0;i<nc;i++) {
data[i]= (data[i]&mask) + div/2;
}
}
}
 
發佈了31 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章