本文整理匯總了Golang中github.com/jvlmdr/go-cv/rimg64.NewMulti函數的典型用法代碼示例。如果您正苦於以下問題:Golang NewMulti函數的具體用法?Golang NewMulti怎麽用?Golang NewMulti使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了NewMulti函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: Apply
func (phi *AdjChanNorm) Apply(x *rimg64.Multi) (*rimg64.Multi, error) {
y := rimg64.NewMulti(x.Width, x.Height, x.Channels)
r := (phi.Num - 1) / 2
for i := 0; i < x.Width; i++ {
for j := 0; j < x.Height; j++ {
k := 0
// Range over which to compute sum.
a, b := k-r, k+r+1
// Take sum excluding leading element.
var t float64
for p := 0; p < min(b, x.Channels); p++ {
t += sqr(x.At(i, j, p))
}
for ; k < x.Channels; k++ {
a, b = k-r, k+r+1
// Set element.
norm := math.Pow(phi.K+phi.Alpha*t, phi.Beta)
y.Set(i, j, k, x.At(i, j, k)/norm)
// Subtract trailing element.
if a >= 0 {
t -= sqr(x.At(i, j, a))
}
// Add leading element.
if b < x.Channels {
t += sqr(x.At(i, j, b))
}
}
}
}
return y, nil
}
示例2: Apply
func (phi SumPool) Apply(x *rimg64.Multi) (*rimg64.Multi, error) {
if phi.Field.X <= 0 || phi.Field.Y <= 0 {
err := fmt.Errorf("invalid field size: %v", phi.Field)
return nil, err
}
if phi.Stride <= 0 {
err := fmt.Errorf("invalid stride: %d", phi.Stride)
return nil, err
}
size := image.Pt(
ceilDiv(x.Width-phi.Field.X+1, phi.Stride),
ceilDiv(x.Height-phi.Field.Y+1, phi.Stride),
)
y := rimg64.NewMulti(size.X, size.Y, x.Channels)
for i := 0; i < y.Width; i++ {
for j := 0; j < y.Height; j++ {
for k := 0; k < x.Channels; k++ {
// Position in original image.
p := image.Pt(i, j).Mul(phi.Stride)
var t float64
for u := p.X; u < p.X+phi.Field.X; u++ {
for v := p.Y; v < p.Y+phi.Field.Y; v++ {
t += x.At(u, v, k)
}
}
y.Set(i, j, k, t)
}
}
}
return y, nil
}
示例3: CorrBankFFT
// CorrBankFFT computes the correlation of an image with a bank of filters.
// h_p[u, v] = (f corr g_p)[u, v]
func CorrBankFFT(f *rimg64.Image, g *Bank) (*rimg64.Multi, error) {
out := ValidSize(f.Size(), g.Size())
if out.X <= 0 || out.Y <= 0 {
return nil, nil
}
// Determine optimal size for FFT.
work, _ := FFT2Size(f.Size())
// Re-use FFT of image.
fhat := fftw.NewArray2(work.X, work.Y)
copyImageTo(fhat, f)
fftw.FFT2To(fhat, fhat)
// Transform of each filter.
curr := fftw.NewArray2(work.X, work.Y)
fwd := fftw.NewPlan2(curr, curr, fftw.Forward, fftw.Estimate)
defer fwd.Destroy()
bwd := fftw.NewPlan2(curr, curr, fftw.Backward, fftw.Estimate)
defer bwd.Destroy()
h := rimg64.NewMulti(out.X, out.Y, len(g.Filters))
alpha := complex(1/float64(work.X*work.Y), 0)
// For each output channel.
for p, gp := range g.Filters {
// Take FFT.
copyImageTo(curr, gp)
fwd.Execute()
// h_p[x] = (G_p corr F)[x]
// H_p[x] = conj(G_p[x]) F[x]
scaleMul(curr, alpha, curr, fhat)
bwd.Execute()
copyRealToChannel(h, p, curr)
}
return h, nil
}
示例4: EvalFunc
// EvalFunc evaluates a function on every window in an image.
// If the input image is M x N and the window size is m x n,
// then the output is (M-m+1) x (N-n+1).
// If the window size is larger than the image size in either dimension,
// a nil image is returned with no error.
func EvalFunc(im *rimg64.Multi, size image.Point, f ScoreFunc) (*rimg64.Image, error) {
if im.Width < size.X || im.Height < size.Y {
return nil, nil
}
r := rimg64.New(im.Width-size.X+1, im.Height-size.Y+1)
x := rimg64.NewMulti(size.X, size.Y, im.Channels)
for i := 0; i < r.Width; i++ {
for j := 0; j < r.Height; j++ {
// Copy window into x.
for u := 0; u < size.X; u++ {
for v := 0; v < size.Y; v++ {
for p := 0; p < im.Channels; p++ {
x.Set(u, v, p, im.At(i+u, j+v, p))
}
}
}
y, err := f(x)
if err != nil {
return nil, err
}
r.Set(i, j, y)
}
}
return r, nil
}
示例5: CorrMultiBankStrideBLAS
// CorrMultiBankStrideBLAS computes the strided correlation of
// a multi-channel image with a bank of multi-channel filters.
// h_p[u, v] = sum_q (f_q corr g_pq)[stride*u, stride*v]
func CorrMultiBankStrideBLAS(f *rimg64.Multi, g *MultiBank, stride int) (*rimg64.Multi, error) {
out := ValidSizeStride(f.Size(), g.Size(), stride)
if out.X <= 0 || out.Y <= 0 {
return nil, nil
}
h := rimg64.NewMulti(out.X, out.Y, len(g.Filters))
// Size of filters.
m, n, k := g.Width, g.Height, g.Channels
// Express as dense matrix multiplication.
// h_p[u, v] = sum_q (f_q corr g_pq)[u, v]
// h = A(f) X(g)
// where A is whk by mnk
// with w = ceil[(M-m+1)/stride],
// h = ceil[(N-n+1)/stride].
a := blas.NewMat(h.Width*h.Height, m*n*k)
{
var r int
for u := 0; u < h.Width; u++ {
for v := 0; v < h.Height; v++ {
var s int
for i := 0; i < g.Width; i++ {
for j := 0; j < g.Height; j++ {
for q := 0; q < g.Channels; q++ {
a.Set(r, s, f.At(stride*u+i, stride*v+j, q))
s++
}
}
}
r++
}
}
}
x := blas.NewMat(m*n*k, h.Channels)
{
var r int
for i := 0; i < g.Width; i++ {
for j := 0; j < g.Height; j++ {
for q := 0; q < g.Channels; q++ {
for p := 0; p < h.Channels; p++ {
x.Set(r, p, g.Filters[p].At(i, j, q))
}
r++
}
}
}
}
y := blas.MatMul(1, a, x)
{
var r int
for u := 0; u < h.Width; u++ {
for v := 0; v < h.Height; v++ {
for p := 0; p < h.Channels; p++ {
h.Set(u, v, p, y.At(r, p))
}
r++
}
}
}
return h, nil
}
示例6: CorrBankStrideFFT
// CorrBankStrideFFT computes the strided correlation of
// an image with a bank of filters.
// h_p[u, v] = (f corr g_p)[stride*u, stride*v]
func CorrBankStrideFFT(f *rimg64.Image, g *Bank, stride int) (*rimg64.Multi, error) {
out := ValidSizeStride(f.Size(), g.Size(), stride)
if out.X <= 0 || out.Y <= 0 {
return nil, nil
}
// Compute strided convolution as the sum over
// a stride x stride grid of small convolutions.
grid := image.Pt(stride, stride)
// But do not divide into a larger grid than the size of the filter.
// If the filter is smaller than the stride,
// then some pixels in the image will not affect the output.
grid.X = min(grid.X, g.Width)
grid.Y = min(grid.Y, g.Height)
// Determine the size of the sub-sampled filter.
gsub := image.Pt(ceilDiv(g.Width, grid.X), ceilDiv(g.Height, grid.Y))
// The sub-sampled size of the image should be such that
// the output size is attained.
fsub := image.Pt(out.X+gsub.X-1, out.Y+gsub.Y-1)
// Determine optimal size for FFT.
work, _ := FFT2Size(fsub)
// Cache FFT of image for convolving with multiple filters.
// Re-use plan for multiple convolutions too.
fhat := fftw.NewArray2(work.X, work.Y)
ffwd := fftw.NewPlan2(fhat, fhat, fftw.Forward, fftw.Estimate)
defer ffwd.Destroy()
// FFT for current filter.
ghat := fftw.NewArray2(work.X, work.Y)
gfwd := fftw.NewPlan2(ghat, ghat, fftw.Forward, fftw.Estimate)
defer gfwd.Destroy()
// Allocate one array per output channel.
hhat := make([]*fftw.Array2, len(g.Filters))
for k := range hhat {
hhat[k] = fftw.NewArray2(work.X, work.Y)
}
// Normalization factor.
alpha := complex(1/float64(work.X*work.Y), 0)
// Add the convolutions over channels and strides.
for i := 0; i < grid.X; i++ {
for j := 0; j < grid.Y; j++ {
// Take transform of downsampled image given offset (i, j).
copyStrideTo(fhat, f, stride, image.Pt(i, j))
ffwd.Execute()
// Take transform of each downsampled channel given offset (i, j).
for q := range hhat {
copyStrideTo(ghat, g.Filters[q], stride, image.Pt(i, j))
gfwd.Execute()
addMul(hhat[q], ghat, fhat)
}
}
}
// Take the inverse transform of each channel.
h := rimg64.NewMulti(out.X, out.Y, len(g.Filters))
for q := range hhat {
scale(alpha, hhat[q])
fftw.IFFT2To(hhat[q], hhat[q])
copyRealToChannel(h, q, hhat[q])
}
return h, nil
}
示例7: Apply
func (phi *MaxPool) Apply(x *rimg64.Multi) (*rimg64.Multi, error) {
if phi.Field.X <= 0 || phi.Field.Y <= 0 {
err := fmt.Errorf("invalid field size: %v", phi.Field)
return nil, err
}
if phi.Stride <= 0 {
err := fmt.Errorf("invalid stride: %d", phi.Stride)
return nil, err
}
size := image.Pt(
ceilDiv(x.Width-phi.Field.X+1, phi.Stride),
ceilDiv(x.Height-phi.Field.Y+1, phi.Stride),
)
y := rimg64.NewMulti(size.X, size.Y, x.Channels)
for i := 0; i < y.Width; i++ {
for j := 0; j < y.Height; j++ {
for k := 0; k < x.Channels; k++ {
// Position in original image.
p := image.Pt(i, j).Mul(phi.Stride)
max := math.Inf(-1)
for u := 0; u < phi.Field.X; u++ {
for v := 0; v < phi.Field.Y; v++ {
q := p.Add(image.Pt(u, v))
max = math.Max(max, x.At(q.X, q.Y, k))
}
}
y.Set(i, j, k, max)
}
}
}
return y, nil
}
示例8: CorrBankBLAS
// CorrBankBLAS computes the correlation of an image with a bank of filters.
// h_p[u, v] = (f corr g_p)[u, v]
func CorrBankBLAS(f *rimg64.Image, g *Bank) (*rimg64.Multi, error) {
out := ValidSize(f.Size(), g.Size())
if out.X <= 0 || out.Y <= 0 {
return nil, nil
}
// Express as dense matrix multiplication.
// h_p[u, v] = (f corr g_q)[u, v]
// Y(h) = A(f) X(g)
// If the number of output channels is k, then
// A is (M-m+1)(N-n+1) x mn and
// X is mn x k, so that
// Y is (M-m+1)(N-n+1) x k.
h := rimg64.NewMulti(out.X, out.Y, len(g.Filters))
m, n, k := g.Width, g.Height, len(g.Filters)
a := blas.NewMat(out.X*out.Y, m*n)
{
var r int
for u := 0; u < h.Width; u++ {
for v := 0; v < h.Height; v++ {
var s int
for i := 0; i < g.Width; i++ {
for j := 0; j < g.Height; j++ {
a.Set(r, s, f.At(i+u, j+v))
s++
}
}
r++
}
}
}
x := blas.NewMat(m*n, k)
{
var r int
for i := 0; i < g.Width; i++ {
for j := 0; j < g.Height; j++ {
for p := 0; p < h.Channels; p++ {
x.Set(r, p, g.Filters[p].At(i, j))
}
r++
}
}
}
y := blas.MatMul(1, a, x)
{
var r int
for u := 0; u < h.Width; u++ {
for v := 0; v < h.Height; v++ {
for p := 0; p < h.Channels; p++ {
h.Set(u, v, p, y.At(r, p))
}
r++
}
}
}
return h, nil
}
示例9: Apply
func (phi *PosPart) Apply(x *rimg64.Multi) (*rimg64.Multi, error) {
y := rimg64.NewMulti(x.Width, x.Height, x.Channels)
for i := 0; i < x.Width; i++ {
for j := 0; j < x.Height; j++ {
for k := 0; k < x.Channels; k++ {
y.Set(i, j, k, math.Max(0, x.At(i, j, k)))
}
}
}
return y, nil
}
示例10: FlipMulti
// FlipMulti mirrors a multi-channel image in x and y.
func FlipMulti(f *rimg64.Multi) *rimg64.Multi {
g := rimg64.NewMulti(f.Width, f.Height, f.Channels)
for i := 0; i < f.Width; i++ {
for j := 0; j < f.Height; j++ {
for k := 0; k < f.Channels; k++ {
g.Set(f.Width-1-i, f.Height-1-j, k, f.At(i, j, k))
}
}
}
return g
}
示例11: randMulti
func randMulti(width, height, channels int) *rimg64.Multi {
f := rimg64.NewMulti(width, height, channels)
for i := 0; i < width; i++ {
for j := 0; j < height; j++ {
for k := 0; k < channels; k++ {
f.Set(i, j, k, rand.NormFloat64())
}
}
}
return f
}
示例12: Apply
func (phi *ChannelInterval) Apply(f *rimg64.Multi) (*rimg64.Multi, error) {
g := rimg64.NewMulti(f.Width, f.Height, phi.B-phi.A)
for u := 0; u < f.Width; u++ {
for v := 0; v < f.Height; v++ {
for p := phi.A; p < phi.B; p++ {
g.Set(u, v, p-phi.A, f.At(u, v, p))
}
}
}
return g, nil
}
示例13: Apply
func (phi *Scale) Apply(x *rimg64.Multi) (*rimg64.Multi, error) {
y := rimg64.NewMulti(x.Width, x.Height, x.Channels)
for u := 0; u < x.Width; u++ {
for v := 0; v < x.Height; v++ {
for p := 0; p < x.Channels; p++ {
y.Set(u, v, p, float64(*phi)*x.At(u, v, p))
}
}
}
return y, nil
}
示例14: DecimateMulti
// DecimateMulti takes every r-th sample starting at (0, 0).
func DecimateMulti(f *rimg64.Multi, r int) *rimg64.Multi {
out := ceilDivPt(f.Size(), r)
g := rimg64.NewMulti(out.X, out.Y, f.Channels)
for i := 0; i < g.Width; i++ {
for j := 0; j < g.Height; j++ {
for k := 0; k < g.Channels; k++ {
g.Set(i, j, k, f.At(r*i, r*j, k))
}
}
}
return g
}
示例15: parseImageCSV
func parseImageCSV(rows [][]string) (*rimg64.Multi, error) {
// Convert to numbers.
var (
u, v, w []int
f []float64
)
for _, r := range rows {
if len(r) == 0 {
continue
}
if len(r) != 4 {
panic("wrong number of elements in row")
}
ui, err := strconv.ParseInt(r[0], 10, 32)
if err != nil {
return nil, err
}
vi, err := strconv.ParseInt(r[1], 10, 32)
if err != nil {
return nil, err
}
wi, err := strconv.ParseInt(r[2], 10, 32)
if err != nil {
return nil, err
}
fi, err := strconv.ParseFloat(r[3], 64)
if err != nil {
return nil, err
}
u = append(u, int(ui))
v = append(v, int(vi))
w = append(w, int(wi))
f = append(f, fi)
}
// Take max over u, v, w.
var width, height, channels int
for i := range u {
width = max(u[i]+1, width)
height = max(v[i]+1, height)
channels = max(w[i]+1, channels)
}
// Set pixels in image.
im := rimg64.NewMulti(width, height, channels)
for i := range u {
im.Set(u[i], v[i], w[i], f[i])
}
return im, nil
}