2
A
回答
4
我只想解決農作物的情況,因爲調整大小的情況涉及到重採樣,並且稍微複雜一些。讓我知道你是否真的需要這個。
讓我們假設您的源MPSImage
是128x128像素的12個特徵通道(3切片)圖像,您的目標圖像是64x64像素的8個特徵通道圖像(2個切片),並且您要複製源的最後兩個片的右下64x64區域放入目的地。
沒有API,我所知道的,它允許你從/一次複製到一個數組質感的多個片,所以你需要發出多個blit的命令,以覆蓋所有的切片:
let sourceRegion = MTLRegionMake3D(64, 64, 0, 64, 64, 1)
let destOrigin = MTLOrigin(x: 0, y: 0, z: 0)
let firstSlice = 1
let lastSlice = 2 // inclusive
let commandBuffer = commandQueue.makeCommandBuffer()
let blitEncoder = commandBuffer.makeBlitCommandEncoder()
for slice in firstSlice...lastSlice {
blitEncoder.copy(from: sourceImage.texture,
sourceSlice: slice,
sourceLevel: 0,
sourceOrigin: sourceRegion.origin,
sourceSize: sourceRegion.size,
to: destImage.texture,
destinationSlice: slice - firstSlice,
destinationLevel: 0,
destinationOrigin: destOrigin)
}
blitEncoder.endEncoding()
commandBuffer.commit()
2
我不確定爲什麼要剪裁,但請記住MPSCNN圖層可以在MPSImage的較小部分上工作。只需設置offset
和clipRect
屬性,該圖層將只在源圖像的該區域上工作。
事實上,你可以使用MPSCNNNeuronLinear
這種方式做你的莊稼。不知道這是否比使用blit編碼器更快或更慢,但它確實更簡單。
編輯:增加了一個代碼示例。這是從內存類型,因此它可能有小的誤差,但這是總體思路:
// Declare this somewhere:
let linearNeuron = MPSCNNNeuronLinear(a: 1, b: 0)
然後,當你運行你的神經網絡,添加以下內容:
let yourImage: MPSImage = ...
let commandBuffer = ...
// This describes the size of the cropped image.
let imgDesc = MPSImageDescriptor(...)
// If you're going to use the cropped image in other layers
// then it's a good idea to make it a temporary image.
let tempImg = MPSTemporaryImage(commandBuffer: commandBuffer, imageDescriptor: imgDesc)
// Set the cropping offset:
linearNeuron.offset = MPSOffset(x: ..., y: ..., z: 0)
// The clip rect is the size of the output image.
linearNeuron.clipRect = MTLRegionMake(0, 0, imgDesc.width, imgDesc.height)
linearNeuron.encode(commandBuffer: commandBuffer, sourceImage: yourImage, destinationImage: tempImg)
// Here do your other layers, taking tempImg as input.
. . .
commandBuffer.commit()
相關問題
- 1. OpenGL紋理深度(裁剪紋理)
- 2. 如何疊加紋理而不裁剪基礎紋理?
- 3. 如何在Xcode中裁剪可調整大小的裁剪矩形?
- 4. 調整時裁剪UILabelFontSizeToFitWidth
- 5. 在繪製之前裁剪GLES紋理
- 6. 如何使用OpenGL在Android中按角度裁剪紋理?
- 7. 如何在OpenGL中裁剪和縮放紋理
- 8. 裁剪矩陣
- 9. OpenGL(LWJGL + SlickUTIL) - 如何在特定的座標上裁剪紋理
- 10. 在Wordpress中裁剪和調整圖像
- 11. Android - 如何使用紋理裁剪相機預覽
- 12. com.android.camera.action.CROP調整裁剪矩形的大小
- 13. 無裁剪調整畫布的尺寸
- 14. 我如何得到裁剪的整數
- 15. 如何在ImageMagick和Paperclip中調整大小和裁剪?
- 16. 如何在php中使用imagick? (調整大小和裁剪)
- 17. XNA:在3D中彼此靠近的紋理正在剪裁
- 18. ImageMagick:轉換,裁剪,調整大圖像
- 19. 調整大小和裁剪圖像
- 20. Scalr調整大小和裁剪大小
- 21. 調整大小和裁剪圖像
- 22. 自動裁剪和調整圖像
- 23. 將UIImage調整爲100%和裁剪
- 24. C#圖像裁剪+調整器
- 25. 調整大小然後裁剪PHP
- 26. 裁剪和調整圖像大小
- 27. C#裁剪和調整大圖像
- 28. 調整大小和裁剪圖像
- 29. 腓IMG調整大小裁剪
- 30. CodeIgniter調整大小和裁剪與軸
我upvoted這兩個問題的答案,但@ warrenm似乎更適合。我也喜歡你的想法。 – s1ddok
你還可以提供一個簡單的代碼,介紹如何用'NeuronLinear'裁剪'MPSImage'?我發現我需要將'a'設置爲'1',將'b'設爲'0',但不知道下一步該怎麼做。 – s1ddok
如果'yourImage'是3通道圖像(例如RGB),'tempImg'是1通道圖像:如何使用linearNeuron實現通道更改? dest-region應該包含'R'或更好的灰色表示。當我用(,, 3)和(,, 1)指定ImageDescriptors時,整個事件都會崩潰。 – Chris