Giter Site home page Giter Site logo

Comments (3)

jjjkkkjjj avatar jjjkkkjjj commented on May 24, 2024 2

Hi @franva
I've just implemented conversion functions (Matft.image.cgimage2mfarray and Matft.image.mfarray2cgimage)
So, you can process image as mfarray!

Examples are below;

@IBOutlet weak var originalImageView: UIImageView!
@IBOutlet weak var reverseImageView: UIImageView!
@IBOutlet weak var swapImageView: UIImageView!

func reverse(){
    var image = Matft.image.cgimage2mfarray(self.reverseImageView.image!.cgImage!)

    // reverse
    image = image[Matft.reverse] // same as image[~<<-1]
    self.reverseImageView.image = UIImage(cgImage: Matft.image.mfarray2cgimage(image))
}


func swapchannel(){
    var image = Matft.image.cgimage2mfarray(self.swapImageView.image!.cgImage!)

    // swap channel
    image = image[Matft.all, Matft.all, MfArray([1,0,2,3])] // same as image[0~<, 0~<, MfArray([1,0,2,3])]
    self.swapImageView.image = UIImage(cgImage: Matft.image.mfarray2cgimage(image))
}

image-processing

Please refer to the example here.

from matft.

jjjkkkjjj avatar jjjkkkjjj commented on May 24, 2024 1

@franva
Thank you for your feedback and sorry for late reply!
I didn't suppose image processing in Matft but what Matft can connect to UIImage may be helpful. (Also complex supporting(#24)).

I found opencv's conversion codes, and referred to it. Finally, I could convert UIImage into MfArray (opposite conversion too).

The code is below;

@IBOutlet weak var originalImageView: UIImageView!
@IBOutlet weak var processedImageView: UIImageView!

func reverse(){
    let size = CFDataGetLength(self.processedImageView.image!.cgImage!.dataProvider!.data)
    let width = Int(self.processedImageView.image!.size.width)
    let height = Int(self.processedImageView.image!.size.height)
    
    var arr = Matft.nums(Float.zero, shape: [height, width, 4])
    var dst = Array<UInt8>(repeating: UInt8.zero, count: arr.size)
    
    // UIImage to MfArray
    arr.withDataUnsafeMBPtrT(datatype: Float.self){
    
        let srcptr = CFDataGetBytePtr(self.processedImageView.image?.cgImage?.dataProvider?.data)!
        
        // unit8 to float
        vDSP_vfltu8(srcptr, vDSP_Stride(1), $0.baseAddress!, vDSP_Stride(1), vDSP_Length(size))
    }

    // reverse
    arr = arr[~<<-1]
    arr = arr.conv_order(mforder: .Row)
    
    // MfArray to UIImage
    arr.withDataUnsafeMBPtrT(datatype: Float.self){
        srcptr in
        
        dst.withUnsafeMutableBufferPointer{
            // float to unit8
            vDSP_vfixu8(srcptr.baseAddress!, vDSP_Stride(1), $0.baseAddress!, vDSP_Stride(1), vDSP_Length(arr.size))
            
            let colorSpace = CGColorSpaceCreateDeviceRGB()
            let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue | CGImageByteOrderInfo.orderDefault.rawValue)
            let provider = CGDataProvider(data: CFDataCreate(kCFAllocatorDefault, $0.baseAddress!, arr.size))
            let cgimage =  CGImage(width: arr.shape[1], height: arr.shape[0], bitsPerComponent: 8*1, bitsPerPixel: 8*arr.shape[2], bytesPerRow: arr.shape[1]*arr.shape[2], space: colorSpace, bitmapInfo: bitmapInfo, provider: provider!, decode: nil, shouldInterpolate: false, intent: CGColorRenderingIntent.defaultIntent)
            
            self.processedImageView.image = UIImage(cgImage: cgimage!)
        }
        
    }
      
  }

The output is like this;

image-processing

Whole code is here.

Matft doesn't support full fancy indexing, so perfect image processing may not be done. but I hope this helps you.

from matft.

jjjkkkjjj avatar jjjkkkjjj commented on May 24, 2024

The above code has some problems.

  • Multiple conversions (UInt8 -> Float(MfArray), to Row major order, Float(MfArray) -> UInt8)
  • The code is not understandable...
    • example: arr.withDataUnsafeMBPtrT(datatype: Float.self)

The second point may be solved by the next protocol version(Readme was not updated).

from matft.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.