int sobel_argb32_3x3_partial(vbx_uword_t *sobel_out, vbx_uword_t *argb_in, const short image_width, const short image_height, const short image_pitch, const short renorm) { VBX::Prefetcher<vbx_uword_t> input(1,image_width,argb_in,argb_in+image_height*image_pitch,image_pitch); VBX::Vector<vbx_uword_t> output(image_width); VBX::Vector<vbx_uhalf_t>* luma[3]; luma[0]=new VBX::Vector<vbx_uhalf_t>(image_width); luma[1]=new VBX::Vector<vbx_uhalf_t>(image_width); luma[2]=new VBX::Vector<vbx_uhalf_t>(image_width); VBX::Vector<vbx_uhalf_t> gradient_x(image_width); VBX::Vector<vbx_uhalf_t> gradient_y(image_width); VBX::Vector<vbx_uhalf_t>* sobel_rows[3]; sobel_rows[0]=new VBX::Vector<vbx_uhalf_t>(image_width); sobel_rows[1]=new VBX::Vector<vbx_uhalf_t>(image_width); sobel_rows[2]=new VBX::Vector<vbx_uhalf_t>(image_width); input.fetch(); int rowmod3=0; for(int row=0;row<image_height;row++){ input.fetch(); VBX::Vector<vbx_uhalf_t>& sobel_top= *sobel_rows[rowmod3]; VBX::Vector<vbx_uhalf_t>& sobel_bot= *sobel_rows[mod3(rowmod3+2)]; VBX::Vector<vbx_uhalf_t>& luma_top= *luma[rowmod3]; VBX::Vector<vbx_uhalf_t>& luma_mid= *luma[mod3(rowmod3+1)]; VBX::Vector<vbx_uhalf_t>& luma_bot= *luma[mod3(rowmod3+2)]; rowmod3=mod3(rowmod3+1); argb_to_luma8(luma_bot,input[0]); sobel_row( sobel_bot ,luma_bot); if(row<2){ continue; } gradient_y=absdiff(sobel_top,sobel_bot); gradient_x=luma_top +luma_bot + luma_mid*2; gradient_x[1 upto image_width-1]=absdiff(gradient_x[0 upto image_width-2],gradient_x[2 upto image_width]); output=((gradient_x + gradient_y) >> renorm); output.cond_move(output>0xFF,0xFF); output*=0x010101; //write to output buffer, skipping first and last elements output[1 upto (image_width -1)].dma_write(sobel_out+(row-1)*image_pitch +1); } output=0; output.dma_write(sobel_out); output.dma_write(sobel_out+ (image_height-1)*image_pitch); delete luma[0]; delete luma[1]; delete luma[2]; delete sobel_rows[0]; delete sobel_rows[1]; delete sobel_rows[2]; return 0; }
void argb_to_luma8(vbx_ubyte_t* output,vbx_uword_t* input,int rows,int cols) { VBX::Prefetcher<vbx_uword_t> v_in(1,cols,input,input+rows*cols,cols); VBX::Vector<vbx_uhalf_t> v_luma_calc(cols); VBX::Vector<vbx_ubyte_t> v_luma_byte(cols); v_in.fetch(); for(int i=0; i<rows; i++) { v_in.fetch(); argb_to_luma8(v_luma_calc,v_in[0]); v_luma_byte=v_luma_calc; v_luma_byte.dma_write(output+i*cols); } }